- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以,我在下面的代码中遇到了异常。我已经把异常细节放在一起,但我相信这是由于不同的线程释放锁然后启动锁的线程造成的。我想这样做是为了在写入排队和发生时允许我的主线程继续。
首先,我想知道是否有办法做到这一点?其次,应该这样做还是一个糟糕的计划?已经查看了 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/
我是一名优秀的程序员,十分优秀!