繁体   English   中英

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

[英]Can I use ManualResetEvent across assemblies?

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

Assembly2.B 类:

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 吗? 这怎么行?

谢谢!

编辑:我已经更新了代码以获得更有效的示例,请不要介意语法,我只是想传达这个想法。

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

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

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

Assembly1.ClassA中的代码不知道它是在与Assembly2.ClassB单独的线程中调用的,因此我认为引入一种机制是不好的风格,其中Assembly1.ClassA.task1表示它已完成。

对于您的场景,看起来您只需要调用Thread.Join

Thread.Join 方法

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

例子:

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
   ...
}

请注意,这与

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)
        {
            ...
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM