本文主要是介绍C#异步编程ConfigureAwait的使用小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf...
异步编程是并发的一种形式,它有两大好处:
异步编程的两个关键字:async和await。
需要注意:如果async方法有返回值,应返回Task<T>;如果没有返回值,应返回Task。
严重警告:不要用void作为async方法的返回类型!async方法可以返回void,但这仅限于编写事件处理程序。一个普通的async方法如果没有返回值,要返回Task,而不是void。
有了上述背景知识,我们来快速看一个例子:
async Task DOSomethingAsync() { int val = 13; //以同步方式执行 // 异步方式等待1秒 await Task.Delay(TimeSpan.FromSeconds(1)); val *= 2; // 异步方式等待1秒 await Task.Delay(TimeSpan.FromSeconds(1)); Trace.WriteLine(val); }
上述代码,DoSomethingAsync方法在最开始时,以同步方式执行。当遇到await时,如果这个异步等待操作没有完成,就暂停DoSomethingAsync方法并返回这个Task,当这个Task完成操作后,继续以同步方式执行后续的代码。
问题:如果在UI线程中调用DoSomethingAsync,这个方法的每个同步程序块www.chinasem.cn都将在此UI线程上运行。怎么避免这种错误行为呢?这就用到了await中的ConfigureAwait方法。
async Task DoSomethingAsynchttp://www.chinasem.cn()
{
int val = 13; //以同步方式执行
// 异步方式等待1秒
// 将continueOnCapturedCoChina编程ntext参数设为false,则会在线程池线程里继续运行
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
val *= 2;
// 异步方式等待1秒
await Task.Delay(TimeSpan.FromSeconds(1));
Trace.WriteLine(val);
}
关于异步方法,还有一条重要的准测:你一旦在代码中使用了异步,最好一直使用。调用异步方法时,应该用await等待它返回的task对象。一定要避免使用Task.Wait或Task<T>.Result方法,因android为它们会导致死锁。
有两种基本的方法可以创建Task实例:
Task.Run创建计算类的任务(CPU实际执行的指令)TaskFactory.StartNew需要特定的计划运行TaskCompletionSource<T>创建基于事件的EbGxlq任务(例如:大部分I/O任务)
到此这篇关于C#异步编程ConfigureAwait的使用小结的文章就介绍到这了,更多相关C#异步ConfigureAwait内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于C#异步编程ConfigureAwait的使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!