我有以下任务偶尔会运行并利用外部提供的资源。
// start receiving the data
receiving = Task.Run(() =>
{
string dataCopy = string.Empty;
string next = string.Empty;
while (true)
{
next = this.buffer.Take(t);
if(!string.IsNullOrEmpty(next))
{
// keep appending the data
dataCopy += next;
// check if we've gotten the EOL
if(dataCopy.Contains(endOfLine))
{
// remove the EOL
dataCopy = this.lib.RemoveString(dataCopy, endOfLine);
break;
}
}
t.ThrowIfCancellationRequested();
}
return dataCopy;
}, t);
我的意图是当另一个线程在CancellationTokenSource
上触发触发器时立即取消任务。其中,当任务花费大部分时间坐在buffer
(类型为BlockingCollection
)时,当.Take
抛出时,任务很可能立即取消它的例外。
现在我关注的是......在.Take
方法调用之间执行任务的可能性很小,但在<{em} this.lib.RemoveString
调用之前执行... lib
对象是外部提供的资源,因此将从外部处理(希望在此线程执行完毕后)。
有什么说我的代码赢了ObjectDisposedException
一次试图调用RemoveString
方法?我如何防范这种情况?