我有一个界面迫使我实现(异步)任务:
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(() => {}))
,但我无法完全理解正确的实现方式和原因。
答案 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);
}
顺便说一句,我讨厌这个名字。如果有人有更好的建议,我会全力以赴。