我可以跨程序集使用ManualResetEvent吗?

时间:2011-07-22 02:54:36

标签: c# multithreading

我还处于计划阶段,所以我没有完整的代码来展示。但我很好奇如果要在不同程序集之间同步线程,将如何使用manualresetevent。例如,我在assembly1中编写了执行task1()的classA。接下来,我在Assembly2中有另一个classB,我在其中创建一个运行classA.task1()的线程。我想让classB等到classA完成。重要的是(让我们假设)我在一个单独的线程上运行它。简而言之,代码片段将如下所示:

Assembly2.ClassB:

private void main() { // for brevity
   Thread newThread = new Thread(new ThreadStart(assembly1.classA.task));
   newThread.Start();
   // Wait until some process in classA.task() is done

   if(classA.mySocket.Connected) {
        // this may never occur because task1() didn't complete it's job
   }

   // do the rest
}

Assembly1.ClassA

public Socket mySocket;

public void task1() {
   // must stop all other threads until these lines have
   // been processed

   // create socket, and connect to remote endpoint

   // Ok, to signal other threads to continue.
   startReceiving();
}

private void startReceiving() {
   while(IsValid) {
       mySocket.Receive(); //
   }
}

我是否需要在两个类上创建ManualResetEvents?这怎么可行?

谢谢!

修改 我已经更新了代码以获得更有效的示例,请不要介意语法,我只想尝试解决这个问题。

2 个答案:

答案 0 :(得分:2)

是的,这很好,但您需要在两个对象之间共享ManualResetEvent的实例。您可以通过ThreadParameterizedThreadStart的构造函数传递此共享实例。

但如果您所做的只是等到newThread完成,只需使用Thread.Join

newThread.Start();
newThread.Join();

答案 1 :(得分:2)

Assembly1.ClassA中的代码不知道它是在Assembly2.ClassB的单独线程中调用的,所以我认为引入Assembly1.ClassA.task1表示它是private void Main() { Thread newThread = new Thread(new ThreadStart(Assembly1.ClassA.Task1)); // Start thread newThread.Start(); // Wait until the invoked method returns newThread.Join(); // Do the rest ... } 的机制是不好的方式完成。

对于您的方案,您似乎只需要致电Thread.Join

  

Thread.Join方法

     

阻止调用线程,直到线程终止

示例:

private void Main()
{
   // Invoke method and wait until invoked method returns
   Assembly1.ClassA.Task1();

   // Do the rest
   ...
}

请注意,这与

相同
Assembly1.ClassA

所以我想我不明白你的问题。


根据您更新的问题,我会说public class ClassA { private Socket socket; private Thread thread; public void Connect() { socket = new Socket(...); socket.Connect(...); thread = new Thread(DoWork); thread.Start(); } public void Disconnect() { socket.Shutdown(SocketShutdown.Both); socket.Close(); thread.Join(); } private void DoWork() { try { while (true) { int received = socket.Receive(buffer, ...); if (received == 0) { break; } // process buffer ... } } catch (SocketException) { ... } } } 应该是启动线程的责任:

{{1}}