一个代码如何用于HttpClient.GetStreamAsync()之类的异步方法?

时间:2014-08-01 13:55:34

标签: c# async-await c#-5.0

详细说明我想知道的是如何异步启动任务,就像HttpClient.GetStreamAsync()等异步方法一样?

示例代码如下所示:

    static async Task<string> LengthyOperation()
    {
        Console.WriteLine("Executing a lengthy operation...");
        Debug.WriteLine("LENGTHY THREAD ID: " + Thread.CurrentThread.ManagedThreadId);

        var task = new Task(() =>
            {
                Debug.WriteLine("TASK THREAD ID: " + Thread.CurrentThread.ManagedThreadId);
                for (int i = 0; i < 10000; i++)
                {
                    File.ReadAllLines("abc.txt");
                    counter++;
                }
            });

        task.Start();
        await task;
    }

主线程id(运行LongyOperation方法)在这种情况下与运行此任务的主线程不同。
LENGTHY THREAD ID不应该与TASK THREAD ID相同吗?

3 个答案:

答案 0 :(得分:1)

您可以使用TaskScheduler

样品

TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
task.Start(scheduler); //use the schedular

结果

LENGTHY THREAD ID: 8
TASK THREAD ID: 8

答案 1 :(得分:1)

实际上非常简单,你需要另一种方法

private async Task LongTaskImpl()
{
    Debug.WriteLine("TASK THREAD ID: " + Thread.CurrentThread.ManagedThreadId);
    for (int i = 0; i < 10000; i++)
    {
       File.ReadAllLines("abc.txt");
       counter++;
    }
}    

static async Task LengthyOperation()
{
    Console.WriteLine("Executing a lengthy operation...");
    Debug.WriteLine("LENGTHY THREAD ID: " + Thread.CurrentThread.ManagedThreadId);

    var task = LongTaskImpl();
    await task;
}

现在,您有一个与其调用者在同一线程上运行的任务。 但是,代码中没有任何异步,因此它将只是同步运行。只是将某些内容添加到任务中并不意味着它神奇地变为异步,您必须为此调用(并等待)一些异步操作。

答案 2 :(得分:1)

  

如何异步启动任务,就像HttpClient.GetStreamAsync()等异步方法一样?

理想情况下,只有自然异步方法(如I / O)才会公开异步API。这通常通过Task.Factory.FromAsyncTaskCompletionSource<T>完成。

E.g:

static Task MyOpAsync()
{
  var tcs = new TaskCompletionSource<object>();
  ... // Establish a callback that calls tcs.TrySetResult when the operation completes
  return tcs.Task;
}