Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继续执行任务中的UI线程_C#_Winforms_Visual Studio - Fatal编程技术网

C# 继续执行任务中的UI线程

C# 继续执行任务中的UI线程,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我有许多控件创建需要异步处理的消息。我希望有一个在任务运行时更新UI的通用函数,但这是错误的(?),因为在Visual Studio中调试代码时,它会以不同的方式处理异常(请参见底部的更新代码) 如何重新编写这段代码,以便在不复制每个事件处理程序中的UI逻辑的情况下正确地完成常见的工作 private async void button1_Click(object sender, EventArgs e) { await myTaskAsync(button1); } private

我有许多控件创建需要异步处理的消息。我希望有一个在任务运行时更新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);
}
只需将所有按钮的事件处理程序更改为按钮。\u单击:

button1.Click += Buttons_Click;
button2.Click += Buttons_Click;

wait
在UI线程上自动恢复。“在任务中”是没有意义的。您确实有任何异步/非阻塞工作吗?调用链最终等待TaskCompletionSource。任务由ActionBlock完成。因此,当您运行此代码时,您遇到了什么问题?在Visual Studio中,在按钮后调用的UI代码表现不同。(如果将异常放在任务中,则生成异常的方式不同于将代码放在事件handler中)。这让我认为代码是有味道的,我做错了什么。