c# – 顶级任务导致错误“当前的SynchronizationContext可能不会用作TaskScheduler.”[复制]

c# – 顶级任务导致错误“当前的SynchronizationContext可能不会用作TaskScheduler.”[复制],第1张

概述参见英文答案 > The current SynchronizationContext may not be used as a TaskScheduler                                    3个 我还没有看到答案,尽管我已经查看了stackoverflow和文档. 如果我调用从计时器处理程序或其他任务创建任务的代码,则此错误将在下面的ContinueWidth 参见英文答案 > The current SynchronizationContext may not be used as a TaskScheduler                                    3个
我还没有看到答案,尽管我已经查看了stackoverflow和文档.

如果我调用从计时器处理程序或其他任务创建任务的代码,则此错误将在下面的ContinueWIDth上出现.例如,如果它被包装在另一个任务中,该任务每隔一个间隔(例如每1秒)创建一次任务,如下所示.我有高级别任务的唯一原因是每个间隔创建这些较低的任务.

//更高级别的任务创建

Task task = Task.Factory.StartNew(new Action(UpdateallDuringInterval));

private voID UpdateallDuringInterval()    {        Stopwatch stopWatch = new Stopwatch();        do        {            // Start the stopwatch            stopWatch.Start();            // Create tasks            List<Task> tasks = CreateTasksAndStart();            // Wait for the tasks to complete if testing,since want to check results            if (this._testMode)            {                Task[] taskArray = tasks.ToArray();                Task.WaitAll(taskArray);            }            if (!_testMode)            {                // Get remaining time to complete interval and sleep for that time                int remainingTimeInMilliseconds = this._pollingIntervalinMilliseconds -                                                  (int) stopWatch.Elapsed.TotalMilliseconds;                    // truncating milliseconds                if (remainingTimeInMilliseconds > 0)                    Thread.Sleep(remainingTimeInMilliseconds);                        // will give time to cpu. Note that using Sleep used to be frowned upon but no longer due to advantages in multitasksing/cpu utilization            }        } while (!_testMode); // continue updating stocks once per interval if not testing    }    private List<Task> CreateTasksAndStart()    {        var tasks = new List<Task>();        lock (syncLock)        {            for (int i = 0; i < _stocksToUpdate.Count; i++)            {                var item = _stocksToUpdate[i];                var initialTask = Task.Factory.StartNew(() =>                {                    GetUpdatedStockinformation(item);                });                var continuationTask = initialTask.ContinueWith((antecendent) =>                {                    UpdateUIWithUpdatedStockinformation();                },CancellationToken.None,TaskContinuationoptions.OnlyOnRanToCompletion,TaskScheduler.FromCurrentSynchronizationContext());                // For testing,we want to wait on the continuation task to make sure updates are done                tasks.Add(continuationTask);            }        }        return tasks;    }

如果需要更多信息,请告诉我.随意给我这个代码的其他陷阱.谢谢!

解决方法 原因很简单但是解决方案可能需要您重新设计任务的一些交互.您没有设置SynchronizationContext(即SynchronizationContext.Current为null),因此无法从中创建TaskScheduler.一种选择是在UI线程上运行的地方调用TaskScheduler.FromCurrentSynchronizationContext(),然后向下传递到构造延续的方法.另一个是创建任务以传递它们,以便UI线程可以附加延续.

通常认为像_testMode这样的标志是代码气味,可能只是测试代码集.然后你有一些你没有真正测试的交互,因为测试代码做了一件事,但实际的应用程序做了另一件事.

总结

以上是内存溢出为你收集整理的c# – 顶级任务导致错误“当前的SynchronizationContext可能不会用作TaskScheduler.”[复制]全部内容,希望文章能够帮你解决c# – 顶级任务导致错误“当前的SynchronizationContext可能不会用作TaskScheduler.”[复制]所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1218780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存