Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Threading.Thread-对其执行操作_C#_Multithreading_C++ Cli - Fatal编程技术网

C# System.Threading.Thread-对其执行操作

C# System.Threading.Thread-对其执行操作,c#,multithreading,c++-cli,C#,Multithreading,C++ Cli,好的,假设我所拥有的是一个名为线程a的System.Threading.Thread的引用,我在另一个线程上,假设线程B。现在我需要在线程a上执行一段代码,然后切换回。使用我拥有的引用,我如何调用线程A在其中执行操作 我正在制作一个c++/cli库。我的一个对象具有线程关联。我输入一个方法,我需要像在Dispatcher.Invoke中一样交换线程 void AllegroSharp::Display::DrawToBackBuffer(BitmapImage^ image) { al_

好的,假设我所拥有的是一个名为线程a的System.Threading.Thread的引用,我在另一个线程上,假设线程B。现在我需要在线程a上执行一段代码,然后切换回。使用我拥有的引用,我如何调用线程A在其中执行操作

我正在制作一个c++/cli库。我的一个对象具有线程关联。我输入一个方法,我需要像在Dispatcher.Invoke中一样交换线程

void AllegroSharp::Display::DrawToBackBuffer(BitmapImage^ image)
{
    al_draw_bitmap(image->GetBitmap(), (float)image->Rect->Position->X, (float)image->Rect->Position->Y, 0);
}

DrawToBackBuffer在线程B上被调用,而al_draw_位图需要在线程A上被调用,我有一个参考。如何在线程A上执行此操作?线程B只是我执行任务时c生成的某个线程。在托管代码中运行。

线程从头到尾运行一组指令。如果线程A已经在运行,它将执行它被告知从头到尾运行的任何代码。您将无法更改它正在运行的内容,除非它正在积极监视某些共享内存,以获取有关下一步操作的指示。通常,实现这一点的方法是让线程在循环中运行,并在该循环中检查消息队列。然后让其他线程将消息添加到该队列中,以让循环线程完成工作。有很多细节可以让它正常工作,但这是基本的想法

如果在您的特定场景中,线程A是应用程序的GUI线程,那么已经为您设置了此消息传递机制,您可以使用
Control.Invoke
(winforms)或
Dispatcher.Invoke
(WPF)将工作单元传递给GUI线程并等待其完成


编辑:由于在问题中添加了新信息,该答案变得不太适用。好吧。

这是Winforms、WPF还是其他什么?在特定线程上运行任意代码通常是不可能的。除非线程合作,否则它必须解决问题。获取线程安全队列并在清空它的线程中循环。任何线程都可以向队列中添加项,例如委托对象。GUI程序的UI线程总是解决它,控制::Begin/Invoke()或Dispatcher::Begin/Invoke(),这可能是您真正想问的。黑板设计模式会做您想要的吗。。。或者这会严重影响工程设计吗?