c# - TaskScheduler - 执行延续

标签 c# multithreading synchronizationcontext taskscheduler

在阅读了一些关于 TaskScheduler ( good article here ) 的内容后,发现 TaskScheduler 可以:

  1. 安排任务 - 通过使用 QueueTask 方法,在上面的示例中只是将任务执行Post 到选定的 SynchronizationContext

  2. 通过与当前正在运行的框架 (SynchronizationContext) 关联的较低级别的调度程序来安排延续。

2. 是否与TaskCotninueWith 方法有任何关系?我显然理解 1.,但不明白 2. 对于 TaskScheduler 是如何实现的。在 TaskScheduler 的什么方法中会发生这种情况?

最佳答案

Schedule continuations through the lower-level scheduler associated with the currently running framework (SynchronizationContext).

我觉得你有点混淆了。您可以使用给定的 TaskScheduler 并对其执行延续,而不是相反。这正是您分享的帖子中的这个片段所做的:

var ui = TaskScheduler.FromCurrentSynchronizationContext(); 
var tf = Task.Factory; 

blendedImage.ContinueWith(_ => 
{ 
    pictureBox1.Image = blendedImage.Result; 
}, ui); 

它告诉 Task.ContinueWith 按顺序使用 UI TaskScheduler(通过调用 TaskScheduler.FromCurrentSynchronizationContext() 提供)在特定上下文中调用延续,这次是 UI 消息循环。

如果您真的想深入了解细节,当您将 TaskScheduler 传递给 ContinueWith 时,它最终会将其传递给名为 StandardTaskContinuation< 的类 具有以下 Run 方法,最终调用 TaskScheduler.InternalTask​​Queue:

internal void ScheduleAndStart(bool needsProtection)
{
    if (needsProtection)
    {
        if (!this.MarkStarted())
        {
            return;
        }
    }
    else
    {
        this.m_stateFlags |= 65536;
    }
    if (Task.s_asyncDebuggingEnabled)
    {
        Task.AddToActiveTasks(this);
    }
    if (AsyncCausalityTracer.LoggingOn && 
       (this.Options & (TaskCreationOptions)512) == TaskCreationOptions.None)
    {
        AsyncCausalityTracer.TraceOperationCreation(
            CausalityTraceLevel.Required, this.Id, "Task: " +
            ((Delegate)this.m_action).Method.Name, 0uL);
    }
    try
    {
        this.m_taskScheduler.InternalQueueTask(this);
    }
    catch (ThreadAbortException exceptionObject)
    {
        this.AddException(exceptionObject);
        this.FinishThreadAbortedTask(true, false);
    }
    catch (Exception arg_93_0)
    {
        TaskSchedulerException ex = new TaskSchedulerException(arg_93_0);
        this.AddException(ex);
        this.Finish(false);
        if ((this.Options & (TaskCreationOptions)512) == TaskCreationOptions.None)
        {
            this.m_contingentProperties.m_exceptionsHolder.MarkAsHandled(false);
        }
        throw ex;
    }
}

关于c# - TaskScheduler - 执行延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33800937/

相关文章:

c# - 在 C# 中将 'using' 与线程实用程序一起使用 - 何时调用 Dispose?

c# - 使用单个身份验证层对多个 WebAPI 进行身份验证

.net - 同步上下文的切换是否意味着工作将在拥有同步上下文的线程上运行?

c# - 在另一个线程上捕获异常?

c# - SynchronizationContext 在 Task.Run 上流动,但在 await 上不流动

c# - epplus 在获取文本值时添加不需要的小数位

c# - xml linq在同一节点中检索元素

C++ WxWidgets : Single log window for messages from Multiple Threads

multithreading - 如何使用 AsyncCalls 调用无参数类过程?

java - 在这种情况下,正确的 Java 集合是什么?