[英]Continuing with the UI thread in a Task
我有许多控件可以创建需要异步处理的消息。 我想有一个通用的函数在Task运行时更新UI,但这是错误的(?),因为在Visual Studio中调试代码时,它以不同的方式处理异常(请参阅底部的更新代码)。
如何重新编写此代码,以便正确完成常见的工作,而不必在每个事件处理程序中重复UI逻辑?
private async void button1_Click(object sender, EventArgs e)
{
await myTaskAsync(button1);
}
private async void button2_Click(object sender, EventArgs e)
{
await myTaskAsync(button2);
}
private async Task myTaskAsync(Button btn)
{
string originalText = btn.Text;
btn.Text = "Processing";
btn.Enabled = false;
await processAsync(btn.Tag);
btn.Enabled = true;
btn.Text = originalText;
}
更新:
这是更新后的(完整)示例。 根据对reset()函数的调用位置,Visual Studio中生成的异常看起来有所不同。 我不明白这种区别。
public partial class Form1 : Form
{
NumericUpDown numeric = new NumericUpDown();
public Form1()
{
InitializeComponent();
Button b1 = new Button();
Controls.Add(b1);
b1.Click += B1_Click;
numeric.Maximum = 100;
}
private async void B1_Click(object sender, EventArgs e)
{
await delay();
// reset();
}
private void reset()
{
numeric.Value = 102;
}
private async Task delay()
{
await Task.Delay(100);
reset();
}
}
关于什么:
private async void Buttons_Click(object sender, EventArgs e)
{
var button = sender as Button;
if (button != null)
await myTaskAsync(button);
}
只需将所有按钮的事件处理程序更改为buttons_Click:
button1.Click += Buttons_Click;
button2.Click += Buttons_Click;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.