自学内容网 自学内容网

C#的Task

优先使用Task.Run,除非有定制化需求才用Task.Factory.StartNew

Task.Factory.StartNew的TaskScheduler参数颠覆你的认知:

            var cnt = 0;
            var cancelToken = new CancellationTokenSource();
            await Task.Factory.StartNew(() => {
                cnt++;
                Debug.WriteLine($"Thread.CurrentThread.ManagedThreadId1={Thread.CurrentThread.ManagedThreadId}");
            }, cancelToken.Token, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()/*TaskScheduler.Default*/)
                .ContinueWith((t) => {
                    Debug.WriteLine($"Thread.CurrentThread.ManagedThreadId2={Thread.CurrentThread.ManagedThreadId}  {t.AsyncState}  {cnt}");
                }, /*TaskScheduler.Default*/TaskScheduler.FromCurrentSynchronizationContext());
            Debug.WriteLine("task finished");

Thread.CurrentThread.ManagedThreadId1=1
Thread.CurrentThread.ManagedThreadId2=1    1
task finished

如果给Task.Factory.StartNew函数传递TaskScheduler.FromCurrentSynchronizationContext()参数,则在主线程上执行;

TaskScheduler的三个全局静态成员:

Default:Task在线程池中执行

Current:使用启用任务的任务调度方式(如启动任务的任务调度在主线程执行,新的任务也在主线程执行)

FromCurrentSynchronizationContext():主线程中执行

注意:Task.Run和async、await两个关键字兼容,内部也是调用Task.Factory.StartNew实现的;可以看作是微软针对异步操作做了增强的版本。


原文地址:https://blog.csdn.net/henreash/article/details/145059524

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!