【问题标题】:Asynchronous programming (TPL)异步编程 (TPL)
【发布时间】:2017-09-27 18:51:39
【问题描述】:

我想知道,我如何证明 DownloadStringTaskAsync 方法是在同一个线程中触发的,或者不是作为 Main 方法触发的。

class Program
{
    static void Main(string[] args)
    {
        WebClient w = new WebClient();
        Task<string> resultFromWebClient = w.DownloadStringTaskAsync("http://www.omdbapi.com/?s=batman");
        Console.WriteLine($"result = {resultFromWebClient.Result}");
        Console.ReadKey();
    }

}

【问题讨论】:

    标签: c# asynchronous task


    【解决方案1】:

    任务在哪个线程上运行由 TaskScheduler 决定 (https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler(v=vs.110).aspx)。

    因此,在大多数情况下,这是未定义的。它主要取决于线程池中哪些线程可用。例如。如果没有可用的,任务将不得不等待分配一个线程。

    但是,在你的情况下,它肯定不会在同一个线程上运行,因为你的 Main() 方法永远不会将它的线程释放到线程池,因为它不等待任何东西。

    要确定您的异步方法调用发生在哪个线程上,您可以编写代码:

    Task<string> resultFromWebClient = w.DownloadStringTaskAsync("http://www.omdbapi.com/?s=batman");
    

    变成它的等价形式:

    Task<string> resultFromWebClient = Task.Run(async () =>
    {
        var myCurrentThreadIs = System.Threading.Thread.CurrentThread;
        return await w.DownloadStringTaskAsync("http://www.omdbapi.com/?s=batman").ConfigureAwait(false);
    }
    

    但是,DownloadStringTaskAsync() 可以在多个线程上运行,因为它的内部代码可能会等待某些内容并将其线程释放到线程池,并在恢复时分配不同的线程。上面的代码将确定它首先分配给哪个线程。您可以使用 ConfigureAwait(true) 使其同步回其先前的上下文,但这并不能保证将其同步回初始线程。这取决于特定的 SynchronizationContext。

    【讨论】:

      【解决方案2】:

      如何证明 DownloadStringTaskAsync 方法与 Main 方法在同一线程中触发。

      好吧,您可以启用网络跟踪并检查 ETW 日志中的线程 ID。

      或者,您可以创建自己的 async 方法并对其进行测试:

      static void Main(string[] args)
      {
        WebClient w = new WebClient();
        Console.WriteLine(Environment.CurrentManagedThreadId);
        Task<string> resultFromWebClient = GetAsync(w);
        Console.WriteLine($"result = {resultFromWebClient.Result}");
        Console.ReadKey();
      }
      
      static async Task<string> GetAsync(WebClient w)
      {
        Console.WriteLine(Environment.CurrentManagedThreadId);
        return await w.DownloadStringTaskAsync("http://www.omdbapi.com/?s=batman");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        相关资源
        最近更新 更多