gpt4 book ai didi

c# - 跨线程互斥?

转载 作者:太空狗 更新时间:2023-10-30 01:03:15 24 4
gpt4 key购买 nike

所以,我在下面的代码中遇到了异常。我已经把异常细节放在一起,但我相信这是由于不同的线程释放锁然后启动锁的线程造成的。我想这样做是为了在写入排队和发生时允许我的主线程继续。

首先,我想知道是否有办法做到这一点?其次,应该这样做还是一个糟糕的计划?已经查看了 ManualResetEvent、Monitor 和 Mutex,所有这些似乎都是这样做的。请注意,这是针对网络服务器的,这是我第一次编写多线程、可能高流量的服务器。

异常:第一次调用发送(及其回调)时抛出。

System.ApplicationException on mutex.ReleaseMutex(). "Object synchronization method was called from an unsynchronized block of code."

public void SendAsync(byte[] packet)
{
mutex.WaitOne();
client.GetStream().BeginWrite(packet, 0, packet.Length, WriteCallback, null);
}

private void WriteCallback(IAsyncResult ar)
{
client.GetStream().EndWrite(ar);
mutex.ReleaseMutex();

Console.WriteLine("Sent Data to " + RemoteEndPoint);
}

最佳答案

根据 Microsoft 的说法,假设您正在使用 Mutex 类

The Mutex class enforces thread identity, so a mutex can be released only by the thread that acquired it. By contrast, the Semaphore class does not enforce thread identity. A mutex can also be passed across application domain boundaries.

我想,你的回调方法是从另一个线程调用的,它导致了异常。
根据 Microsoft 的建议,您可以在这种情况下使用信号量。

例如:

static volatile Semaphore sem = new Semaphore(1,1);
static void Main(string[] args)
{
Thread oThread = new Thread(new ThreadStart(fn2));
oThread.Start();
Thread.Sleep(200);
sem.WaitOne();
Console.WriteLine("Main is Doing");
Thread.Sleep(2000);

sem.Release();
}
static void fn2()
{
sem.WaitOne();
Console.WriteLine("Thread is Doing");
Thread.Sleep(2000);

sem.Release();
}

关于c# - 跨线程互斥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30181328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com