我想用真正的同步方法创建一个类库,所以我想避免实现一个只使用Task.Run来运行同步代码的虚假异步方法。
我看到过一种方式就是这样:
public Task miMethodAsync()
{
TaskCompletionSource<bool> miTcs = new TaskCompletionSource<bool>();
new Timer(_ =>
{
for (Int64 i = 1; i < 10000000; i++)
{
//todo my long code
}
miTcs.SetResult(true);
})
.Change(0, Timeout.Infinite);
return miTcs.Task;
}
此解决方案使用计时器返回任务,然后在0ms后,它将在计时器内运行代码。
此解决方案不会创建新任务,因此它不会采用线程形式的线程池,因此可伸缩性很好。但我认为这个解决方案,使用计时器来运行同步代码,它不是一个优雅的解决方案,所以我想知道我是如何真正实现一个真正的异步方法。
因为这个解决方案我也可以使用我的同步方法并以这种方式实现asyn方法:
public Task myMethodAsync()
{
TaskCompletionSource<bool> miTcs = new TaskCompletionSource<bool>();
new Timer(_ =>
{
myMethodSync();
miTcs.SetResult(true);
})
.Change(0, Timeout.Infinite);
return miTcs.Task;
}
但是当我发表评论时,我认为这不是一个优雅的解决方案,但实际上它似乎不是假的异步方法,就像我在Task.Run()方法中运行同步代码一样。
答案 0 :(得分:1)
这些将同步代码包装成伪async
方法的包装器都没有任何好处。建议的方法不是创建任何这样的包装器,而是让API用户自己执行Task.Run(SyncMethod)。
查看此article了解详情。