【发布时间】:2014-08-08 19:43:26
【问题描述】:
我无法使用异步方法使我的 UI 正常工作。这是我的代码的一部分
private async void btnDoOutput_Click(object sender, RoutedEventArgs e)
{
/* Initiliaze */
groupBoxConfiguration.IsEnabled = false;
var progressIndicator = new Progress<int>();
progressIndicator.ProgressChanged += (s,value) =>
{
progressExport.Value = (double)value;
labelPercentage.Content = "Export in progress : " + value + " %";
};
/* do Work */
switch (something)
{
case 1:
await method(input, output, options, progressIndicator);
break;
default: break;
}
/* Finalization */
groupBoxConfiguration.IsEnabled = true;
}
方法是
public async static Task<string> method(string input, string output, string options, IProgress<int> progress)
{
while(something)
{
//operations on input and output
if (progress != null)
{
progress.Report(percentage);
}
}
}
当我点击我的按钮时,UI 冻结,groupBox 仍处于启用状态,直到最后才会显示进度。
【问题讨论】:
-
这不可能是您的所有代码,因为您的方法签名无效。
method不返回任何内容,但它是Task<string>。 Async / await 不是“神奇地使我的代码异步”。它是“让这个已经异步的代码更容易使用。”我没有在您的代码中看到任何实际异步发生的事情。 -
您可能会从这个 MSDN 链接中获得很多关于在异步方法中启用进度报告和取消的信息:blogs.msdn.com/b/dotnet/archive/2012/06/06/…
-
我认为你需要类似
return Task.Factory.StartNew<string>(()=>{while(something){...}})
标签: c# wpf user-interface asynchronous async-await