【发布时间】:2016-10-21 11:50:07
【问题描述】:
我一直在重新研究异步任务。无论我如何设置任务,我的应用程序都会一直遭受 UI 冻结的困扰。我有以下代码用于从网页下载字符串:
internal string DownloadString(string URL)
{
var result = LoadCompanyContracts(URL);
return result.Result;
}
internal async Task<string> LoadCompanyContracts(string URL)
{
Task<string> task2 = Task<string>.Factory.StartNew(() =>
{
for (int i = 0; i <= 10000000; i++) Console.WriteLine(i);
WebClient wc = new WebClient();
string tmp = wc.DownloadString(new Uri(URL));
return tmp;
});
return task2.Result;
}
当我执行此任务并在 for 循环期间,我的应用程序的 UI 冻结。即使我相信这段代码不应该冻结 UI,我也无法找到解决方案。我已经尝试了许多不同的选项,并且真的想在 webclient 异步中使用任务而不是线程或事件。
信息:我正在为我的项目使用 .net 4.5。我的代码的不同之处在于这些函数在一个类库中(不知道是否重要)。
是否可以通过从我的代码中调用 DownloadString 函数来运行此代码而不用异步等待阻塞用户界面?如果不是,还有什么替代方案(任何好的 nuget 包)?
【问题讨论】:
-
result.Result这个块 -
那是使用
async和Task.Result的错误方式。 -
有趣的是,编译器本身会给你一个警告,特别指出
LoadCompanyContracts将同步运行。
标签: c# wpf asynchronous task