如何转换方法:
static void DoWork(Action<bool> onCompleteCallback)
{
Task doWork = new Task( ()=>Thread.Sleep(2000) );
Action<Task> onComplete = (task) => {
onCompleteCallback(true); // should execute on the main thread
};
doWork.ContinueWith(onComplete, TaskScheduler.FromCurrentSynchronizationContext());
doWork.Start();
}
到异步。
如果我将它转换为 Async,会有什么不同?
最佳答案
使用async
的部分原因和 await
是为了避免回调。通过使用新的 async
支持,你的方法本身可以返回 Task
(或 Task<T>
),你可以只使用 await
在它上面,避免了完全传递回调的需要。
如果你想使用新的异步/等待设置,你可以这样写:
static Task DoWork()
{
return Task.Run( () => /* Your work */ Thread.Sleep(2000) );
};
区别实际上在于您如何调用它。不使用回调,您只需编写:
await DoWork();
// Do your callback work here - it'll automatically be mapped into the right sync context and happen after the above completes
当然,你可以传递回调函数,然后写成:
static async Task DoWork(Action<bool> onCompleteCallback)
{
await Task.Run( ()=>Thread.Sleep(2000) ); // Or use Task.Delay(2000) if you just want a pause...
onCompleteCallback(true);
};
这只是(在某种程度上)违背了使用新支持的目的,因为主要优势之一是您不再需要传递回调并将您的逻辑“由内而外”。
关于c# - 将 onCallback 转换为异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285740/