[英]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,但是此程序向我显示
那为什么会发生呢?
我在控制台应用程序中做了相同的测试
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");
});
}
它告诉我
您正在使用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.