如何编写异步和阻塞方法

时间:2019-05-06 21:28:14

标签: c# asynchronous

我在程序中同时使用了阻塞和异步方法。 我的阻塞方法使用带有.GetAwaiter()。GetResult()的异步方法。但是在不同的消息来源中说,最好创建单独的Blocking和Async方法 如果我同时需要阻塞和异步调用,如何正确编写代码?创建两个方法?

例如-在WPF中使用异步方法,并在线程/计时器/后台工作者中进行阻止

1 个答案:

答案 0 :(得分:-1)

编辑正如其他人提到的那样,使用异步和同步方法是一种不好的做法。主持人清理了我的初始答案,其中确实包含其他不良做法,例如async void,该做法保留给事件方法使用。所以基本上,不要这样!找到更好的方法。

这里是一个示例。 方法PrintToConsole可以运行“异步”或“同步”(默认同步),您只需要传递一些信息即可确定采用哪条路线。这里我以枚举为例。

public enum runAsync {
    No = 0,
    Yes =1
}

public static async Task PrintToConsole(string inVal, runAsync method = runAsync.No)
{
    if (method == runAsync.Yes)
    {
        await Task.Dealy();                
        Console.WriteLine(inVal + "async");
    }            
    else
    {
         Console.WriteLine(inVal + "sync");
    }
}

static async Task Main(string[] args) {

    Console.WriteLine("Async: Started");
    await PrintToConsole("Async: Finished!", runAsync.Yes);
    Console.WriteLine("Sync: Started");
    PrintToConsole("Sync: Finished!");
    Console.ReadLine();


    return;
}

结果是:

"Async: Started"
"Sync: Started"
"Sync: Finished!"
"Async: Finished!"

在实际代码中,您将在每个分支中分别使用替代API,例如ExecuteNonQueryAsyncExecuteNonQuery