Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 异步等待_C#_Wpf_Multithreading_Asynchronous - Fatal编程技术网

C# 异步等待

C# 异步等待,c#,wpf,multithreading,asynchronous,C#,Wpf,Multithreading,Asynchronous,我正在尝试使用异步单击事件: private async void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " click_begin"); await changeProgressBarAsync(ProgresBar_mainLoad); MessageBox.Show(Thread.Current

我正在尝试使用异步单击事件:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "   click_begin");
    await changeProgressBarAsync(ProgresBar_mainLoad);
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "    click_end");
}

public Task changeProgressBarAsync(ProgressBar pb)
{
    return Task.Factory.StartNew(() =>
    {
        MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "    task");
        int count = 100;
        while (count-- > 0)
        {
            pb.Dispatcher.Invoke(() =>
            {
                pb.Value += 1;
            });

            Thread.Sleep(10);
        }
    });
}
在异步等待C#逻辑之后,行

MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "    task");

应显示相等的线程Id, 但是这个节目告诉我

  • 1单击“开始”
  • 5任务
  • 1单击“结束”
那为什么会这样呢

我在控制台应用程序中做了同样的测试

static void Main(string[] args)
{
    TestClick();
    Console.ReadKey();
}

public static async void TestClick()
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is TestClick1");
    await Worker();
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is TestClick2");
}

public static Task Worker()
{
    return Task.Factory.StartNew(() =>
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is Task");
    });
}
它告诉我

  • 这是测试点击
  • 这是一项艰巨的任务
  • 这是测试点击2

您正在使用task.Factory.StartNew()显式启动新任务。这几乎总是在非UI线程中运行

异步/等待的方法不是在不同的线程上启动新任务,也不是使用调度程序,也不是使用
thread.Sleep
,而是
task.Delay
。那么你就有:

public async Task ChangeProgressBarAsync(ProgressBar pb)
{
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "    task");
    int count = 100;
    while (count-- > 0)
    {
        pb.Value++;
        await Task.Delay(10);
    }
}
任何地方都没有额外的线程


在控制台应用程序中,由于控制台应用程序没有同步上下文,您会看到不同的线程-没有任何东西可以使延续与最初等待的线程在同一线程中执行。

您正在使用task.Factory.StartNew()显式启动新任务。这几乎总是在非UI线程中运行

异步/等待的方法不是在不同的线程上启动新任务,也不是使用调度程序,也不是使用
thread.Sleep
,而是
task.Delay
。那么你就有:

public async Task ChangeProgressBarAsync(ProgressBar pb)
{
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + "    task");
    int count = 100;
    while (count-- > 0)
    {
        pb.Value++;
        await Task.Delay(10);
    }
}
任何地方都没有额外的线程


在您的控制台应用程序中,您会看到不同的线程,因为控制台应用程序没有同步上下文-没有任何东西可以使延续在与最初等待的线程相同的线程中执行。

谢谢您的回答!谢谢你的回答!