我使用 C# 5.0 (async/await) 的新异步模式进行了一些测试,但我在理解如何调用异步方法时遇到了问题。
考虑到这段代码:
private async Task<string> DownloadAsync()
{
progress.ProgressChanged += (s, e) =>
{
progressBar1.Value = e.value;
};
return await DownloadSomething(myurl, progress);
}
private async void CallDownloadAsync()
{
string text = await DownloadAsync();
progressBar1.Value = 0;
label1.Text = "Done!";
}
private void button4_Click(object sender, EventArgs e)
{
CallDownloadAsync();
}
所以,这段代码工作得很好。当我单击“button4”时,下载任务开始并且我的 ProgressBar 已正确更新。
但是,我想通过删除这样的 CallDownloadAsync() 方法来进一步压缩我的代码:
private void button4_Click(object sender, EventArgs e)
{
new Action(async () =>
{
string result = await Task.Run<string>(() => DownloadAsync());
}).Invoke();
label1.Text = "Running...";
}
所以在这里,我想直接启动一个调用 DownloadAsync 方法的操作,但是当我点击我的 Button4 时,我的跨线程操作在进度条上无效。所以我不明白 Action() 和我的 CallDownloadAsync() 方法的调用之间的主要区别是什么。