gpt4 book ai didi

c# - 使用 c#5.0 调用异步方法

转载 作者:行者123 更新时间:2023-12-02 05:07:00 25 4
gpt4 key购买 nike

我使用 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 时,我在 progressBar 上有一个跨线程操作无效。所以我不明白 Action() 和 CallDownloadAsync() 方法的调用之间的主要区别是什么。

最佳答案

你可以找到我的 async/await intro有帮助。特别是,async 方法不在后台线程上运行; Task.Run 用于在后台线程上运行某些内容,因此您的代码有所不同。

一般来说,您应该避免使用async void,除非您正在编写一个async 事件处理程序。像这样:

private async void button4_Click(object sender, EventArgs e)
{
label1.Text = "Running...";
string result = await DownloadAsync();
progressBar1.Value = 0;
label1.Text = "Done!";
}

关于c# - 使用 c#5.0 调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16144358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com