C#4.0的并行库TPL,即Task(一)http://47.98.154.65/?id=1793
C#4.0的并行库TPL,即Task(二) http://47.98.154.65/?id=1798
C#4.0的并行库TPL,即Task(三) http://47.98.154.65/?id=1808
C#4.0的并行库TPL,即Task(四) http://47.98.154.65/?id=1815
C#4.0的并行库TPL,即Task(五) http://47.98.154.65/?id=1816
C#4.0的并行库TPL,即Task(六) http://47.98.154.65/?id=1831
C#4.0的并行库TPL,即Task(七)http://47.98.154.65/?id=1850
勇哥继续这个话题,这一篇记录的问题如下:
TaskScheduler 调度器的TryExecuteTask方法,take出第一个方法后执行出现异常,异常很奇怪,居然是IsCanceled。
然尔我并没有取消任务!!!
(图1) 异常内容由vs的插件OzCode显示。
(图2) 异常内容由vs的插件OzCode显示。
搜索了网络,有人提到了这个问题,摘录如下:
-------------------------------------------------------------
错误内容:
System.Threading.Tasks.TaskCanceledException: A task was canceled. at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.AsyncQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync() System.Threading.Tasks.TaskCanceledException: A task was canceled. at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.AsyncQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
-------------------------------------------------------------
其实,在百度上搜索这个问题之前,勇哥也做过实验,把TaskScheduler 调度器调用的异步方法更换为同步方法,则不会有这种问题。
因此也是估计问题出在同步代码调用异步代码的问题上面。
原则上应该保证异步方法调用异步方法,一直这种串下去。但是我的代码是以同步代码书写的,只是部分使用异步代码,如此看来,臣妄真得做不到呀!
这个问题的解决办法见下面贴子,其2楼的答案解决了我目前的问题:
MSDN论坛问题贴子:如何在C#中从同步方法调用异步方法? http://47.98.154.65/?id=1851

