gpt4 book ai didi

c# - 在 C# 中,您将如何编码对后台线程的调用并在其上下文中执行它?

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:07 25 4
gpt4 key购买 nike

假设我有一个 UI 线程和一个订阅我创建的自定义线程安全 ObservableCollection 的后台线程,这样每当集合发生变化时,它就会在适当的上下文中执行回调。

现在假设我向集合中添加了一些内容(从任一线程,无论哪个线程),它现在必须将回调编码到两个线程。要在 UI 上下文中执行回调,我可以简单地执行 Dispatcher.Invoke(...) 并在 UI 上下文中执行回调;伟大的。

现在我想在后台线程的上下文中执行回调(不要问我为什么,很可能是它访问的任何内容都关联到该特定线程或具有它需要访问的线程本地存储);我该怎么做?

后台线程没有调度程序/消息泵送机制,所以我不能使用调度程序或 SynchronizationContext,那么如何中断后台线程并让它在其上下文中执行我的回调?

编辑:我不断得到明显错误的答案,所以我一定没有正确解释自己。忘掉 UI 线程和 UI 调度程序吧,他们本来是要编码对 UI 线程的调用,就是这样!想象一下两个工作线程 A 和 B。如果 A 修改了我的集合,那么 A 负责将回调编码到自身和 B。在 A 的上下文中执行回调很容易,因为 A 是触发它的人:只需就地调用委托(delegate).现在 A 需要将回调编码到 B...现在怎么办? Dispatcher 和 SynContext 在这种情况下没用

最佳答案

扩展您自己的 TaskScheduler 也是一个好主意,您必须实现三个方法:

QueueTask、TryExecuteTaskInline 和 GetScheduledTasks

你可以阅读它here

这样,任何时候你需要在你的专用线程上运行一些东西,你可以这样做:

Task.Factory.StartNew(() => { SomeAction }, SomeCancellationToken, TaskCreationOptions
new MyTaskSchedular());

并让它在您的线程上执行。

关于c# - 在 C# 中,您将如何编码对后台线程的调用并在其上下文中执行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23006526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com