gpt4 book ai didi

c# - 最佳实践 winforms async/await 关键字

转载 作者:行者123 更新时间:2023-12-02 20:45:39 25 4
gpt4 key购买 nike

测试一点 TPL。

我使用这段代码并且它有效:

async void button1_Click(object sender, EventArgs e)
{
MyClass2 mc2 = new MyClass2();
label1.Text = "Start";
List<string> list = await mc2.GetInfosAsync("test123");
label1.Text = "";
list.ForEach(x => label1.Text += x + "\n");
}

class MyClass2
{
public Task<List<string>> GetInfosAsync(string txt)
{
return Task.Factory.StartNew<List<string>>(() => GetInfos(txt));
}

public List<string> GetInfos(string txt)
{
//doing long-listbuilding-operation
}
}

但我想知道这是否是使用 async 和 await 关键字的最佳实践,我对“操纵”button1_click 事件的签名感到有点不舒服。

最佳答案

在 Windows 窗体事件处理程序上使用异步是正确且推荐的方法。如果您不使用异步等待,您可能会看到死锁(除非您使用的是 ConfigureAwait(false))。

在您的代码中一直使用异步等待。不要使用 Wait() 或 Result

一件重要的事情是,将所有逻辑保存在单独的方法中以使单元可测试。测试 async void 会很困难。您不能将方法更改为异步任务

// Will result in compilation error 
private async Task button1_Click(object sender, EventArgs e)

// Because of event handler signature
public delegate void EventHandler(object sender, EventArgs e);

下面提到的 msdn 文章中提到了一个很好的例子来处理这个问题

public async void button1_Click(object sender, EventArgs e)
{
await this.ButtonClickHandlerAsync()
}

// Unit test this
public async Task ButtonClickHandlerAsync()
{
MyClass2 mc2 = new MyClass2();
label1.Text = "Start";
List<string> list = await mc2.GetInfosAsync("test123");
label1.Text = "";
list.ForEach(x => label1.Text += x + "\n");
}

更多详情- https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

PS:我假设您的问题是关于“在 winform 按钮单击事件处理程序上使用异步的良好做法”吗?从技术上讲,异步不是方法签名的一部分(只有方法名称和参数)。如果您的问题实际上是关于签名的,请忽略此答案。

关于c# - 最佳实践 winforms async/await 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44541534/

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