免责声明(完全可编辑/可移动)
我已完成了我的作业,但据我所知,我看不出我想知道的事情(这有点令人惊讶,所以我确信这是一个善良的灵魂将标记为重复 - 请提前接受我的道歉,哈哈)。
背景和预期问题
当我启动Outlook时,我正在从CRM Dynamics执行更新,这需要一段时间。所以,我决定将更新放在一个帖子中。它的工作原理应该是但功能区上有一个按钮,允许用户手动调用更新。预计一个疯狂的用户,我意识到有人会点击之前的按钮原始更新完成后,所有类型的排泄物都可能会遇到气体再分配设备。
建议的解决方案
为了避免这种情况,我按照以下方式设置了私有财产。
private bool KeepYourPantsOn { get; set; }
只要所述属性为true
(在我开始更新线程之前将其设置为正确),所有疯狂点击将被忽略或被冷静和信息性处理
MessageBox.Show("Yes, yes... Updating still... Keep your pants on.");
但是一旦线程完成,我希望该属性翻转到false
,使用户能够手动更新Outlook。
实施问题
我的注意事项是,我没有找到任何OnFinished
,WhenDone
等方法来调用以切换KeepYourPantsOn
的值。此外,我还没有真正看到任何建议的解决方案如何解决(或者说 - 我没有感知任何解决方案 - 我可能已经看到一个没有意识到这是因为无知在线程编程领域内。)
答案 0 :(得分:0)
您应该能够将bool
设置为false
作为线程中的最后一行(或者作为最后一行,然后循环返回以等待某些内容,如果您的线程执行此操作)。
注意@Tudor关于volatile
的评论 - 只是为了确定,这样做。
答案 1 :(得分:0)
您可以为属性创建后备存储以保存值,并在设置或获取值时使用lock
以确保不会出现并发问题。
之后,当您在单独的线程上开始处理时,将值设置为true
,在退出方法之前,将值设置为false
。
在用户点击时,只需检查KeepYourPantsOn
属性的值,如果信息仍为true
则显示该信息。
class YourClass
{
private static readonly object _syncRoot = new object();
private bool _keepYourPantsOn;
public bool KeepYourPantsOn
{
get
{
lock(_syncRoot)
{
return _keepYourPantsOn;
}
}
set
{
lock(_syncRoot)
{
_keepYourPantsOn = value;
}
}
}
private ThreadMethod()
{
KeepYourPantsOn = true; //signal that the update process is starting...
// perform your logic
KeepYourPantsOn = false; //signal that the update process is finished
}
public ManualUpdate()
{
if(KeepYourPantsOn)
MessageBox.Show("Yes, yes... Updating still... Keep your pants on.");
else
Update();
}
}