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
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);
}
}
任何地方都没有额外的线程
在您的控制台应用程序中,您会看到不同的线程,因为控制台应用程序没有同步上下文-没有任何东西可以使延续在与最初等待的线程相同的线程中执行。谢谢您的回答!谢谢你的回答!