c# - 将 onCallback 转换为异步

标签 c# multithreading task async-await

如何转换方法:

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/

相关文章:

c# - 搜索 FileStream 然后使用 StreamReader 从那里读取

c# - Task.Run a void 方法和 Task 方法返回 null 有区别吗?

c# - 流式运算符与延迟执行有何不同?

C# - 从主窗口更改为 MVVM 格式 WPF 应用程序中的另一个页面

python - 我惊呆了 : weird problem with python and sockets + threads

.net - 如何本地化应用程序中所有线程的字符串资源查找?

java - 同步的java线程错误的输出顺序

C# Fire and Forget 任务并丢弃

configuration - 在单节点集群上确定 Hadoop Conf 设置的一般方法

c# - Nuget DLL hell : Could not load file or assembly System. 运行时