我得到了以下代码(在多线程环境中效果不佳)
public class SomeClass
{
private readonly ConcurrentQueue<ISocketWriterJob> _writeQueue = new ConcurrentQueue<ISocketWriterJob>();
private ISocketWriterJob _currentJob;
public void Send(ISocketWriterJob job)
{
if (_currentJob != null)
{
_writeQueue.Enqueue(job);
return;
}
_currentJob = job;
_currentJob.Write(_writeArgs);
// The job is invoked asynchronously here
}
private void HandleWriteCompleted(SocketError error, int bytesTransferred)
{
// error checks etc removed for this sample.
if (_currentJob.WriteCompleted(bytesTransferred))
{
_currentJob.Dispose();
if (!_writeQueue.TryDequeue(out _currentJob))
{
_currentJob = null;
return;
}
}
_currentJob.Write(_writeArgs);
// the job is invoked asycnhronously here.
}
}
如果当前没有正在执行的作业,则 Send 方法应该异步调用作业。如果有的话,它应该排队工作。
锁定_currentJob
分配/检查将使一切正常。但是有没有一种无锁的方法来解决它?
更新
我正在使用套接字,它是SendAsync
发送信息的方法。这意味着我不知道Send()
调用该方法时是否有写/作业挂起。