![](/img/trans.png)
[英]Can I use a lock with this ManualResetEvent to ensure thread safety?
[英]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.