【发布时间】:2014-02-19 21:25:31
【问题描述】:
我有 2 个类 Main.cs 和 Processing.cs(简称 P 和 M)类 M 通过一个 html 链接调用 P,P 在 tern 下载,转换为 Base64,重命名并保存文件,然后返回一个字符串回到 M,现在我需要 M 等到所有这些都完成才能继续,但我一直没能。
我在事件处理程序中使用了 lambda 表达式,以便能够在该函数中执行所有操作,而不是为事件触发器使用单独的函数,因此我可以使用 Base64 转换文件返回字符串,但它只是返回空字符串,不要等到它被分配。
我认为 taskA.Wait() 调用会使其等待所有处理完成,但事实并非如此
如果有人有任何想法,我将不胜感激。
来自 Main.cs 的调用是这样的:
Processing processing = new processing();
String _link = “http://www.something.com”;
var ResultBase64_Val = processing.FileToBase64(_link).Result;
在 Processing.cs 中的函数是:
public async Task<String> FileToBase64(String filePath)
{
String convertedFile = "";
WebClient client = new WebClient();
Task taskA = Task.Factory.StartNew(() => client.OpenReadCompleted += async (object sender, OpenReadCompletedEventArgs e) =>
{
byte[] buffer = new byte[e.Result.Length];
buffer = new byte[e.Result.Length];
await e.Result.ReadAsync(buffer, 0, buffer.Length);
convertedFile = Convert.ToBase64String(buffer);
});
client.OpenReadAsync(new Uri(filePath));
taskA.Wait();
return convertedFile;
}
谢谢, 鲍勃
【问题讨论】:
-
您使用的是什么版本的 .NET?
-
@DavidSchwartz 我正在使用随 Windows 8.1 安装的 .NET Framework 4.5.1 关于您之前的评论,我认为任务意味着块中的所有内容,而不仅仅是
OpenReadComplete事件。我选择了 asyncWebClient方法,因为它是 wp8 应用程序和移动网络并不总是稳定的,所以 async 似乎更安全,对吗? -
考虑使用
System.Security.Cryptography.ToBase64Transform而不是Convert.ToBase64String(参见ToBase64Transform on MSDN for examples)。它将让您直接使用流,而不是在内存中创建字节数组。或者,如果响应大于您根据预期使用情况决定的某个上限,则抛出异常。 -
@DavidSchwartz 这不能解决让任务等到 d/l 完成并转换的问题......除了这些是图像之外,我认为它会有所作为吗?跨度>
-
这就是为什么我添加评论而不是把它放在答案中的原因:) 我会说使用
Stream而不是巨大的字节数组甚至是 more 重要如果您正在下载二进制数据(图像)。如果您将数据从请求流式传输到端点(如文件),您只需将两个流的缓冲区保存在内存中(可能〜 4KB)而不是整个响应(网络上的图像通常在 100 个KB)。
标签: c# asynchronous windows-phone-8 lambda async-await