本文主要是介绍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的使用小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!