我还处于计划阶段,所以我没有完整的代码来展示。但我很好奇如果要在不同程序集之间同步线程,将如何使用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?这怎么可行?
谢谢!
修改 我已经更新了代码以获得更有效的示例,请不要介意语法,我只想尝试解决这个问题。
答案 0 :(得分:2)
是的,这很好,但您需要在两个对象之间共享ManualResetEvent
的实例。您可以通过Thread
上ParameterizedThreadStart
的构造函数传递此共享实例。
但如果您所做的只是等到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}}