繁体   English   中英

WPF异步等待

[英]WPF async await

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

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");

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

应该显示相等的线程ID,但是此程序向我显示

  • 1 click_begin
  • 5项任务
  • 1 click_end

那为什么会发生呢?

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

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");
    });
}

它告诉我

  • 1是TestClick1
  • 三是任务
  • 三是TestClick2

您正在使用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);
    }
}

任何地方都没有多余的线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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