同步实现异步方法

时间:2016-10-06 10:59:45

标签: c# asynchronous task

我有一个界面迫使我实现(异步)任务:

namespace Microsoft.Owin.Security.Infrastructure
{
    public interface IAuthenticationTokenProvider
    {
        ..
        Task CreateAsync(AuthenticationTokenCreateContext context);
        ..
    }
}

我想实现这个方法,但我不是在等待任何事情。虽然我必须等待某事或返回一些任务,否则我的代码不能编译。:

public class MyImplementation: IAuthenticationTokenProvider
{
    public async Task CreateAsync(AuthenticationTokenCreateContext context) 
    {
        /// do something synchronously.

        await something here? ??
    }
}

我的问题是:如果不异步执行某些操作,我将如何实现此方法?我已经找到了几个解决方案(等待task.Yield()await Task.Run(() => {})),但我无法完全理解正确的实现方式和原因。

2 个答案:

答案 0 :(得分:2)

只需实施该方法而无需等待:

public async Task<Foo> GetFooAsync()
{
    return new Foo();
}

你没有等待任何事情并不重要。等待任何东西都不是异步方法的要求(尽管编译器会警告你,你并没有等待任何事情)。

如果你不想要aysnc方法的开销(那里有与异步&#34;状态机相关的费用&#34;可能不合适),你可以

public Task<Foo> GetFooAsync()
{
    return Task.FromResult(new Foo());
}

答案 1 :(得分:0)

我的解决方案是返回一个Task,表示已经执行的同步方法的结果。这样,您就可以将语义维护为异常方法,以解决异常何时浮出水面,而不会产生异步状态机的开销。有趣的是,我在同一个界面上实际上是出于同样的原因

我有一个扩展方法:

    public static Task AsCompletedTask<T>(this Action<T> func, T arg)
    {
        var tcs = new TaskCompletionSource<VoidResult>();
        try
        {
            func(arg);
            tcs.SetResult(voidResult);
        }
        catch (Exception e)
        {
            tcs.SetException(e);
        };

        return tcs.Task;
    }

然后我通过以下方式调用:

    public Task CreateAsync(AuthenticationTokenCreateContext context)
    {
        return ((Action<AuthenticationTokenCreateContext>)Create).AsCompletedTask(context);
    }
顺便说一句,我讨厌这个名字。如果有人有更好的建议,我会全力以赴。