gpt4 book ai didi

C#有异步函数调用同步函数或者同步函数调用异步函数

转载 作者:可可西里 更新时间:2023-11-01 03:10:13 25 4
gpt4 key购买 nike

我正在编写一个 C# .Net 4.5 库来执行常见的 sql 数据库操作(备份、恢复、执行脚本等)。我希望每个操作都有同步和异步功能,因为这个库将被控制台和 GUI 应用程序使用,但我不想在任何地方重复代码。所以在我看来,我有两个选择:

  1. 在同步函数中编写完成工作的代码,然后将其包装在异步函数的任务中,如下所示:

    public void BackupDB(string server, string db)  
    {
    // Do all of the work and long running operation here
    }

    public async Task BackupDBAsync(string server, string db)
    {
    await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);
    }
  2. 编写在异步函数中完成工作的代码,并使用 .Wait() 从同步函数调用它:

    public async Task BackupDBAsync(string server, string db)  
    {
    // Do all of the work and long running operation here, asynchronously.
    }

    public void BackupDB(string server, string db)
    {
    BackupDBAsync(server, db).Wait(); // Execution will wait here until async function finishes completely.
    }

一种选择比另一种更好吗?一个是最佳实践吗?或者还有其他(更好的)替代方案吗?

我知道使用 .Wait() 的一个警告是异步函数中的所有 await 语句都必须使用 .ConfigureAwait(false) 以避免死锁 ( as discussed here ),但由于我正在编写一个库永远不需要访问 UI 或 WebContext 我可以安全地这样做。

我还要注意,SQL 库通常也有同步和异步函数可供使用,所以如果在同步函数中执行工作,我会调用它们的同步函数,如果在异步函数中执行工作函数,我会调用他们的异步函数。

欢迎提出想法/建议。

-- 编辑:我也发布了这个问题 on the MSDN forums here尝试获得官方的 MS 响应 --

最佳答案

I want to have both synchronous and asynchronous functions for each operation, as this library will be used by both console and GUI apps, but I don't want to duplicate code everywhere.

最好的答案是:不要。

Stephen Toub 有两篇关于这个主题的优秀博文:

他建议将异步方法公开为异步,将同步方法公开为同步。如果您需要公开两者,则将通用功能封装在私有(private)(同步)方法中,并复制异步/同步差异。

关于C#有异步函数调用同步函数或者同步函数调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com