我在程序中同时使用了阻塞和异步方法。 我的阻塞方法使用带有.GetAwaiter()。GetResult()的异步方法。但是在不同的消息来源中说,最好创建单独的Blocking和Async方法 如果我同时需要阻塞和异步调用,如何正确编写代码?创建两个方法?
例如-在WPF中使用异步方法,并在线程/计时器/后台工作者中进行阻止
答案 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,例如ExecuteNonQueryAsync
和ExecuteNonQuery
。