.NET 4.7.2 => c-sharp => UI async/await



我试图将文本文件的内容异步加载到文本框中。因此,我的目标是不阻塞ui线程。为了检查这一点,代码用Console.Writeline("…"+Thread.CurrentThread.ManagedThreadId)

给出反馈。我的第一个意图显示了下面的代码,它将在Console.WriteLines()中为我提供线程1。这意味着UI-Thread被阻塞了,对吧?


private async void cmdProgrammLaden_Click(object sender, EventArgs e)
{
Console.WriteLine("Button-Thread-ID: " + Thread.CurrentThread.ManagedThreadId);
this.txtSendData.Text = await DncProgrammLadenAsync();
}
async Task<string> DncProgrammLadenAsync()
{
string path     = String.Empty;
string content  = String.Empty;
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.InitialDirectory = @"c:Test";
openFileDialog.Filter           = "Textfile (*.txt)|*.txt";
openFileDialog.FilterIndex      = 0;
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
path = openFileDialog.FileName;
var filestream = openFileDialog.OpenFile();
using (StreamReader reader = new StreamReader(filestream))
{
content = await reader.ReadToEndAsync();
Console.WriteLine("Task-Thread-ID: " + Thread.CurrentThread.ManagedThreadId);
//Thread.Sleep(3000);
}
}
return content;
}
}


Then I tried to rework this code like *(short version)*
Task.Run(() =>
{
string content = String.Empty;
using (StreamReader reader = new StreamReader(@"c:TestFile C.txt"))
{
content = reader.ReadToEnd();
Console.WriteLine("Task-Thread-ID: " + Thread.CurrentThread.ManagedThreadId);
}

}); 

Then I get different Thread IDs.
But this seems not right to me.
What do I not understand correctly?

这意味着ui线程被阻塞了,对吗?

。默认情况下,await捕获当前上下文,并在await完成时在该上下文中继续执行async方法。在await期间UI线程没有被阻塞,但是代码在await之后的UI线程上恢复执行。

然而,文件流很棘手。如果用异步标志打开,它们只是异步的,我不知道OpenFile是否通过该标志。在同步文件句柄上调用的异步api只是在线程池线程上运行操作(我认为)。

最新更新