如何实现真正的异步方法?

时间:2017-10-20 19:08:11

标签: c# async-await

我想用真正的同步方法创建一个类库,所以我想避免实现一个只使用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()方法中运行同步代码一样。

1 个答案:

答案 0 :(得分:1)

这些将同步代码包装成伪async方法的包装器都没有任何好处。建议的方法不是创建任何这样的包装器,而是让API用户自己执行Task.Run(SyncMethod)。

查看此article了解详情。