如何在 C# 中排队要由 MainThread 调用的函数?
How can I queue a function to be invoked by the MainThread in C#?
我找到了很多关于如何在 UI 线程上调用函数的资源,但我有一些逻辑只允许 运行 来自主线程。有没有办法在主线程上获取调度程序并对其进行调用?
编辑:OP 询问的程序实际上有单独的 UI 和主线程...
您可以随时使用
创建新的threads/tasks
tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
Task.Factory.StartNew(() =>
{
doSomeWork();
}, token);
令牌已使用,您可以取消任务。如果出现问题或任务挂起,您可以取消它。您可能已经阅读过有关 TPL 库的信息,但如果没有,请阅读并查看它是否适用于您想要做的事情。
为了让我的回答更完整一点,我想添加这个...我不确定这对你的情况是否有效,但在正常情况下你会做这样的事情来更新或使用对象在工作线程的主线程中。
private void doSomeWork()
{
// do work here -->
if (someObject.InvokeRequired)
{
someObject.BeginInvoke((Action)delegate() { someObject.Property = someValue; });
}
else
{
someObject.Property = someValue;
}
}
您可以使用信令+数据结构的组合。定义一个变量来保存所需函数调用的详细信息(可能是带有参数的结构),并让您的主线程定期测试是否需要调用。确保锁定处理多线程陷阱的必要对象。您还可以有一个信号对象,并在其上放置启动器 Monitor.Wait
,主线程将在函数完成时发出信号。
"dispatcher" 是一个特定于特定 UI 框架(此处:WPF)的概念。没有可用于定位任何线程的调度程序。想象一下以下线程:
while (true) Console.WriteLine("x");
你打算如何调用那个线程上的东西?它无法完成,因为该线程永远忙于做其他事情。不合作
我有点怀疑您是否需要在 "main thread" 上调用某些东西。但我会从字面上回答这个问题。您需要让主线程合作并接受其他线程的工作。可能是 Action
队列或告诉该线程执行特定操作的布尔标志。
我找到了很多关于如何在 UI 线程上调用函数的资源,但我有一些逻辑只允许 运行 来自主线程。有没有办法在主线程上获取调度程序并对其进行调用?
编辑:OP 询问的程序实际上有单独的 UI 和主线程...
您可以随时使用
创建新的threads/tasks tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
Task.Factory.StartNew(() =>
{
doSomeWork();
}, token);
令牌已使用,您可以取消任务。如果出现问题或任务挂起,您可以取消它。您可能已经阅读过有关 TPL 库的信息,但如果没有,请阅读并查看它是否适用于您想要做的事情。
为了让我的回答更完整一点,我想添加这个...我不确定这对你的情况是否有效,但在正常情况下你会做这样的事情来更新或使用对象在工作线程的主线程中。
private void doSomeWork()
{
// do work here -->
if (someObject.InvokeRequired)
{
someObject.BeginInvoke((Action)delegate() { someObject.Property = someValue; });
}
else
{
someObject.Property = someValue;
}
}
您可以使用信令+数据结构的组合。定义一个变量来保存所需函数调用的详细信息(可能是带有参数的结构),并让您的主线程定期测试是否需要调用。确保锁定处理多线程陷阱的必要对象。您还可以有一个信号对象,并在其上放置启动器 Monitor.Wait
,主线程将在函数完成时发出信号。
"dispatcher" 是一个特定于特定 UI 框架(此处:WPF)的概念。没有可用于定位任何线程的调度程序。想象一下以下线程:
while (true) Console.WriteLine("x");
你打算如何调用那个线程上的东西?它无法完成,因为该线程永远忙于做其他事情。不合作
我有点怀疑您是否需要在 "main thread" 上调用某些东西。但我会从字面上回答这个问题。您需要让主线程合作并接受其他线程的工作。可能是 Action
队列或告诉该线程执行特定操作的布尔标志。