详细说明我想知道的是如何异步启动任务,就像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相同吗?
答案 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.FromAsync
或TaskCompletionSource<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;
}