【发布时间】:2026-01-16 22:15:01
【问题描述】:
我使用 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() 方法的调用之间的主要区别是什么。
【问题讨论】:
标签: c# task-parallel-library async-await c#-5.0 synchronizationcontext