【发布时间】:2014-12-19 11:41:17
【问题描述】:
我正在尝试了解如何将 .net 4.5 async/await 关键字与核心是同步的任务一起使用。 IE。某种复杂的数学计算。在下面的示例中,我使用了 Thread.Sleep 来模拟该操作。我的问题是有没有一种方法可以让这种方法像异步方法一样工作?如果不是,您只需要执行我在 ThisWillRunAsyncTest 方法中所做的操作,并在该同步方法上执行类似 Task.Factory.StartNew 的操作。有没有更清洁的方法?
using System.Threading;
using System.Collections.Generic;
using System.Threading.Tasks;
using NUnit.Framework;
[TestFixture]
public class AsyncAwaitTest
{
[Test]
//This test will take 1 second to run because it runs asynchronously
//Is there a better way to start up a synchronous task and have it run in parallel.
public async void ThisWillRunAsyncTest()
{
var tasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
tasks.Add(Task.Factory.StartNew(() => this.RunTask()));
}
await Task.WhenAll(tasks);
}
[Test]
//This test will take 5 seconds to run because it runs synchronously.
//If the Run Task had an await in it, this this would run synchronously.
public async void ThisWillRunSyncTest()
{
var tasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
tasks.Add(this.RunTask());
}
await Task.WhenAll(tasks);
}
//This is just an example of some synchronous task that I want to run in parallel.
//Is there something I can do in this method that makes the async keyword work? I.e. this would run asynchronously when called from ThisWillRunSyncTest
public async Task RunTask()
{
Thread.Sleep(1000);
}
}
【问题讨论】:
-
如果
RunTask是同步的,那么它根本不应该返回Task,而将其提升到任务中应该由调用者完成。
标签: c# async-await