public void Cancel() { if (CancellTokenSource != null) { lock (CancellTokenSource) { if (!CancellTokenSource.IsCancellationRequested)// && RecvTask != null { CancellTokenSource.Cancel(); } CancellTokenSource.Dispose(); CancellTokenSource = null; } } // TODO:時間がないので配列を一旦コピーしてデッドロックが発生しないようにしておく SendMessageWork[] worklist; lock (SendList) { worklist = new SendMessageWork[SendList.Count]; SendList.CopyTo(worklist); } foreach (var work in worklist) { work.Cancel(); } }
SendMessageWork SendMessage(byte[] header, byte[] body) { if (!IsActive) { Console.WriteLine("Failed SendMessage inactive"); return(null); } SendMessageWork sendWork = new SendMessageWork(Stream, header, body, (work) => { lock (SendList) { SendList.Remove(work); } }); lock (SendList) { SendList.Add(sendWork); } return(sendWork); }