【发布时间】:2014-07-11 15:54:42
【问题描述】:
我有一个显示数据网格的表单。我还有一个在不同线程上运行的方法,它只更新网格的显示单元格。为此,此方法调用表单上的一个函数,该函数返回显示的单元格。
我遇到的问题是,有时当表单已关闭并处置时,另一个线程上的方法仍在调用此函数,这会导致 objectdisposed 异常。有没有办法(除了确保另一个线程上的方法完成)来防止这种情况发生?
所以我需要一个线程安全的方法来在表单关闭时终止后台任务。
private delegate List<foo> GetShownCellsDelegate();
public List<foo> GetShownCells()
{
if (this.InvokeRequired)
{
GetShownCellsDelegate getShownCellsDelegate = new GetShownCellsDelegate(GetShownCells);
return (List<foo>)this.Invoke(getShownCellsDelegate);
}
else
{
//do stuff
}
}
我尝试使用表单的 IsDisposed 属性:
if (!IsDisposed)
{
return (List<foo>)this.Invoke(getShownCellsDelegate);
}
但显然该表单可以在 if 语句之后处理,因为我仍然得到 isdisposed 异常。
这是我在另一个线程上使用该函数的方式:
private CancellationTokenSource cts = new CancellationTokenSource();
public void CancelUpdate()
{
cts.Cancel();
}
public void ReadDataFromDevice()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ReadAllDataThreadPoolMethod));
}
private void ReadAllDataThreadPoolMethod(Object stateInfo)
{
if (!cts.IsCancellationRequested)
{
//do stuff
}
}
从表单上的 IsClosing 事件调用 CancelUpdate 方法。但有时我仍然会遇到 isdisposed 异常。
【问题讨论】:
标签: c# winforms background thread-safety threadpool