繁体   English   中英

继续执行任务中的UI线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM