Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# .net异步编程指南_C#_.net_Async Await - Fatal编程技术网

C# .net异步编程指南

C# .net异步编程指南,c#,.net,async-await,C#,.net,Async Await,我今天一直在学习.net中的异步编程 我的理解是,这段代码不应该创建一个新线程,但我看到了不同的情况 调用Thread.CurrentThread.ManagedThreadId的ThreadId static void Main(string[] args) { Do(); Console.WriteLine("Main {0}",Thread.CurrentThread.ManagedThreadId); Thread.Sleep

我今天一直在学习.net中的异步编程 我的理解是,这段代码不应该创建一个新线程,但我看到了不同的情况 调用Thread.CurrentThread.ManagedThreadId的ThreadId

  static void Main(string[] args)
    {
        Do();
        Console.WriteLine("Main {0}",Thread.CurrentThread.ManagedThreadId);

        Thread.Sleep(400);
    }

    private static async void Do()
    {
        Task<string> task = new StreamReader(@"D:\a.txt").ReadLineAsync();
        string result = await task;
        Console.WriteLine("DO {0}", Thread.CurrentThread.ManagedThreadId);
    }
static void Main(字符串[]args)
{
Do();
WriteLine(“Main{0}”,Thread.CurrentThread.ManagedThreadId);
睡眠(400);
}
私有静态异步void Do()
{
Task Task=new StreamReader(@“D:\a.txt”).ReadLineAsync();
字符串结果=等待任务;
WriteLine(“DO{0}”,Thread.CurrentThread.ManagedThreadId);
}

感谢大家阅读本文。

您获得不同线程ID的原因是您创建了一个控制台应用程序。在UI应用程序上,有一个特殊的
SynchronizationContext
说明回调应该在UI线程上。控制台应用程序没有此同步上下文,因为控制台方法是线程安全的,因此不需要在主线程上调用。这意味着在主线程上的异步调用与在用户创建的线程上的行为相同,即在您看到的情况下对线程池进行回调。

这篇文章有一个很好的解释:感谢链接到文章。哇!大。。你救了我的命dude@user2924454:我有一本书,你可能会觉得有用;我试着让它成为一个介绍,在一篇文章中涵盖你需要知道的一切,在底部有详细的后续链接。它是一个控制台应用程序,所以它的行为就像用户在UI应用程序中创建的线程一样。