我只是想给“的DoSomething”如果 它尚未被运行
你的问题没有足够的信息,让我不禁做出你的代码的假设。
我的第一个假设是,根据签名DataDisplayView_Paint(object s, PaintEventArgs e)
,您的代码在GUI线程上运行。
我的第二个假设是您的代码DOSOMETHING
是同步的。
考虑到这一点,这里是你的代码的版本,这保证了我们只运行DOSOMETHING
如果尚未被运行:
void DataDisplayView_Paint(object s, PaintEventArgs e)
{
//DOSOMETHING
}
GUI线程会一次只处理一个消息,您的DataDisplayView_Paint
方法不会退出,直到DOSOMETHING
完成。如果您使用GUI执行任何操作(如绘制Graphics对象或更改标签),则不会从多个线程调用此代码 - 如果这样做,.NET将抛出异常。换句话说,你不需要需要任何同步。
假设DOSOMETHING
运行asyncronously - 现在我们有一个有趣的问题,但它很容易解决的,你不需要任何的bool。
实质上,您所做的只是在DOSOMETHING运行时禁用您的事件处理程序,然后重新启用它。而不是使用一个布尔的,脱钩,并根据需要rehook事件处理程序:
void DataDisplayView_Paint(object s, PaintEventArgs e)
{
DataDisplayView.Paint -= DataDisplayView_Paint;
DoSomethingAsynchronously(); // re-hooks event handler when completed
}
void DoSomethingAsychronously()
{
ThreadPool.QueueUserWorkItem(() =>
{
try
{
// DOSOMETHING
}
finally
{
// may need a lock around this statement
DataDisplayView.Paint += DataDisplayView_Paint;
}
});
}
我读过你的问题多次,其根本不清楚你想要做什么。你能提供一些背景知识或更完整的描述你的代码应该做什么吗? – Juliet 2010-08-24 15:43:30
到目前为止,所有答案一般都存在于两个阵营之一1)您使用多个线程并且您描述的是线程同步问题或2)您没有使用多个线程,而且您正在描述方法重入问题。你可以通过更新来澄清你的问题吗?根据我迄今看到的情况,我假定了后者。那是对的吗? – 2010-08-24 16:08:03
@朱丽叶,对不起使用“initialSetDone”而不是“运行”混淆了这个问题。 @布莱恩,是的,这是一个重入问题没问题。答案似乎表明我使用的方法是正确的,但可以通过使用try catch来改进 – AidanO 2010-08-25 07:05:18