- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在阅读了一些关于 TaskScheduler
( good article here ) 的内容后,发现 TaskScheduler
可以:
安排任务 - 通过使用 QueueTask
方法,在上面的示例中只是将任务执行Post
到选定的 SynchronizationContext
通过与当前正在运行的框架 (SynchronizationContext
) 关联的较低级别的调度程序来安排延续。
2. 是否与Task
的CotninueWith
方法有任何关系?我显然理解 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.InternalTaskQueue
:
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/
假设我想创建一个自定义 TaskScheduler,但在其中,如果某些条件不适用,则回退到默认值。我该怎么做? 例如 protected override void QueueTask(Task ta
任务并行库非常棒,在过去的几个月里我经常使用它。然而,有件事确实困扰着我:事实上 TaskScheduler.Current是默认的任务计划程序,而不是 TaskScheduler.Default 。
我有一个从数据库中获取产品的任务,以及操作一些 UI 修改的 ContinueWith 操作,因此我遇到了一个问题,因为任务创建了一个新线程,并且没有执行 UI 修改在 UI 线程中。 我尝试使用此修
我有一个具有多个Dispatcher(又名 GUI 线程、又名消息泵)的应用程序,以确保 GUI 的缓慢且无响应的部分运行,而不会严重影响应用程序的其余部分。我也经常使用 Task。 目前,我的代码可
我要实现的是: 任务调度程序,将任务排入队列并并行运行指定数量,而其他任务则在队列中等待开始。每个任务都有超时,当任务运行时开始计数,如果超过该时间,任务将被取消并抛出 TimeoutExceptio
我有一些使用 ReaderWriterLockSlim 的代码。当某个对象被构造时,我在它上面获取写锁,并在一段时间后处理该对象时释放它。但是,由于这些调用的来源,我不能保证它们会在同一个线程上,这是
我发现不需要声明额外的 TaskScheduler,我可以像这样执行任务: 但是你能帮我解释一下吗,为什么不需要像下面这样的? 最佳答案 通用时间表
我在同一台服务器上有两个 spring boot 应用程序 (1.4.3.RELEASE)。应用程序 A 是一个单体应用程序,其中包含用于处理警报的部分代码,而应用程序 B 是一个仅处理警报的新专用应
在阅读了一些关于 TaskScheduler ( good article here ) 的内容后,发现 TaskScheduler 可以: 安排任务 - 通过使用 QueueTask 方法,在上面的
我有以下使用隐式调度的方法: private async Task FooAsync() { await Something(); DoAnotherThing(); await S
根据我的研究,我了解到以下内容: TaskScheduler.UnobservedTaskException必须等待任务被垃圾回收,然后该任务的未观察到的异常才会冒泡到 UnobservedTaskE
我需要在 Windows Server 2008 上通过 Powershell v2 安排任务。我正在使用 MS PowershellPack 中的 TaskScheduler 模块。 . 可以安排任
上个月我问了以下问题,这导致我学习了 TaskEx.Yield: Can async methods have expensive code before the first 'await'? 但是,
actors 中的异步等待支持 我正在将 actor 库 Akka 移植到 .NET ( https://github.com/rogeralsing/Pigeon )我想在我的 Actor 内部添加
我想打印我创建的任务的特定触发器,如何使用 QT Framework 在 C++ 中执行此操作,最好的方法是什么?另外,创建具有多个任务的动态调度程序并能够检索每个任务信息的最佳方法是什么? 最佳答案
TaskScheduler.Default 不总是保证任务将在池线程上执行吗? 在修复 bug 时,我至少发现了一个没有修复的情况。它可以像这样重现(一个由真实代码制作的人为示例): var tcs
我有自己的 TaskScheduler 实现。它存在的主要原因是它将处理器核心亲和性设置为运行我的任务的线程。 当我以下列方式使用它时: var myTaskSceduler = new MyTask
我正在尝试使用 the following custom task scheduler限制并发网络请求: 我是这样使用它的: const int CONCURRENCY_LEVEL = 2; stat
我正在寻求并行化我的项目中的一些工作,我首先使用了 Parallel.ForEach 并且它同时运行得很好,然后首席开发人员过来说他不太喜欢这个并想改变那个。 然后我决定沿着 TaskFactory
我试图设置一个 cron 来在我的 Windows 服务器上运行一个 php 脚本。该脚本在手动访问时运行良好,但无法通过任务计划运行。 问题是: // Code to fetch stuff fro
我是一名优秀的程序员,十分优秀!