1

我写一个文件IsolatedStorageFile与异步调用对WriteAsync的异步调用,我如何知道它什么时候完成?

async void Base64ToImage() 
{ 
    byte[] data; 
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
    using (IsolatedStorageFileStream isfs = isf.OpenFile("image.p64", FileMode.Open, FileAccess.ReadWrite)) 
     { 
     data = new byte[isfs.Length]; 
     isfs.Read(data, 0, data.Length); 
     isfs.Close(); 
     } 

    using (IsolatedStorageFileStream stream = isf.OpenFile("newReConvertedFile.png", FileMode.Create)) 
    { 
     await stream.WriteAsync(data, 0, data.Length); 

///////////////////The problem is here, how would i know when WriteAsync is complete to then fire the reload method? 
     //reLoadFile(); 
     } 
    } 
} 

我需要知道什么时候WriteAsync完成重新加载另一种方法,文件,如何将我去这样做?

编辑:

其实我的第一个想法是将文件保存到isostorage然后孙中山图像URI该文件,但不能设置URI来isostorage为图像或至少我不能去显示

我最初的想法是等待方法调用重新加载文件,但我得到一个错误“???不返回任务,不能等待。考虑改变它返回“,但我不知道如何去做这件事。

这里的想法是将几个图像转换为Base64(SQLite数据库),但只加载所选的,以显示。

的reLoadFile方法如下

async void reLoadFile() 
{ 
    byte[] newFile; 
    using (IsolatedStorageFile newFileLoc = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (IsolatedStorageFileStream newFileStream = newFileLoc.OpenFile("newReConvertedFile.png", FileMode.Open, FileAccess.ReadWrite)) 
     { 
      newFile = new byte[newFileStream.Length]; 
      newFileStream.Read(newFile, 0, newFile.Length); 
      newFileStream.Close(); 

      var ms = new MemoryStream(newFile); 
      var image = new BitmapImage(); 
      image.SetSource(ms); 
      theImage.Source = image; 
     } 
    } 
} 

我一直在寻找的职位,但我不能罚款的方式来得到它的工作,因为如果我把它马上我得到一个异常。 我需要做的是打开文件将其从base64转换为.png,然后在保存后加载.png文件。 如果有人能帮助我,我将不胜感激。

感谢鲍勃。

+0

我不明白为什么这个问题是下投了反对票。它提供了回答这个问题所需的所有细节。 – vcsjones

+0

你不应该使用异步无效,改变你的方法,以异步任务 –

+0

@vcsjones我也不明白它... –

回答

3

1)reloadFile并不需要是async你只需要使用,当你使用await关键字

2)BaseTo64Image需要被声明为async Task Base64ToImage()里面的方法,否则的Base64ToImage()呼叫者将无法告诉它什么时候结束。

3)isfs.Read(data, 0, data.Length);是坏的,只是因为你要求data.Length字节并不意味着你会得到data.Length阅读,您需要检查int阅读回报和循环或使用CopyTo(Stream)复制到另一个流。

4)(实际回答你的问题)关键字await将停止处理函数并等待函数完成。当您点击await关键字时,您的Base64ToImage()函数将返回该函数,代表该函数中其余代码的Task,这取决于您对函数返回的Task的处理。

这里是你的代码的简化版本,使用所有的建议

​​

但是,如果这是你在做什么,而你只是用newReConvertedFile.png作为临时文件,您可以简化您的代码

async Task Base64ToImage() 
{ 
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (IsolatedStorageFileStream isfs = isf.OpenFile("image.p64", FileMode.Open, FileAccess.ReadWrite)) 
    { 
     var ms = new MemoryStream(); 
     var image = new BitmapImage(); 
     await isfs.CopyToAsync(ms); 

     ms.Position = 0; 
     image.SetSource(ms); 
     theImage.Source = image; 
    }  
} 
+0

即时通讯不知道我明白你,也许你可以告诉我一个例子? –

+0

在ReloadFile调用我在这里得到一个错误: var ms = new MemoryStream(newFileStream.Length); 关于你的建议,以进一步简化,我试图保存它有一个参考它应该应用墓碑,你觉得怎么样? –

+0

如果您不告诉我错误是什么,并且为什么保存错误,那么您无法真正帮助您解决错误,除了第二次读取它之外,您正在制作一份文件的副本,然后不进行任何操作。除非你有排除的代码。 –

1

只需在下一行中调用它即可。等待将异步等待,直到WriteAsync完成。这就是“异步/等待”的美妙之处,它允许您编写看起来同步的异步代码。

using (IsolatedStorageFileStream stream = isf.OpenFile("newReConvertedFile.png", FileMode.Create)) 
{ 
    await stream.WriteAsync(data, 0, data.Length); 
    reLoadFile(); 
    } 

我错过了什么吗?

+0

我试过,但我得到一个异常,我认为该文件可能仍然没有保存或仍然被访问那时候? –

+0

@BobMachine只需在using语句后移动'reLoadFile'调用并检查。这应该解决你的问题 –

+0

移动它使用,绝对是问题的一部分,谢谢 –

1

WriteAsync方法在返回的Task完成时完成。

等待任务完成,只是await它:

await stream.WriteAsync(data, 0, data.Length); 
// WriteAsync is complete. 
相关问题