0

免责声明(完全可编辑/可删除)

我已经完成了我的作业,但据我所知,我看不到我想知道的东西(这有点令人惊讶,所以我相信一个善良的灵魂会将我标记为复制品- 请提前接受我的道歉,哈哈)。

背景和预期问题

当我启动 Outlook 时,我正在从 CRM Dynamics 执行更新,这需要一段时间。所以,我决定把更新放在一个线程中。它按预期工作,功能区上有一个按钮,允许用户手动调用更新。预计一个疯狂的用户,我意识到有人会在原始更新完成之前点击按钮,并且各种粪便可能会撞击气体再分配器。

建议的解决方案

为了避免这种情况,我将私有财产如下。

private bool KeepYourPantsOn { get; set; }

只要所述属性是true(在我开始更新线程之前将其设置为正确),所有疯狂的点击都将被忽略或由冷静和信息丰富的处理

MessageBox.Show("Yes, yes... Updating still... Keep your pants on.");

但是一旦线程完成,我希望属性翻转以false使用户能够手动更新 Outlook。

实施问题

我的小问题是我没有找到任何要调用OnFinishedWhenDone等方法来切换KeepYourPantsOn. 此外,我还没有真正看到任何关于如何解决这个问题的建议解决方案(或者,更确切地说 - 我没有看到任何解决方案 - 由于对线程编程领域的无知,我可能已经看到了一个没有意识到的解决方案) .

4

2 回答 2

0

您应该能够将 to 设置boolfalse线程中的最后一行(或者,如果您的线程这样做,则作为循环返回等待某事之前的最后一行)。

请注意@Tudor 评论关于volatile- 只是为了确定,去做。

于 2012-10-03T13:00:39.327 回答
0

您可以为您的属性创建一个后备存储来保存该值,并lock在您设置或获取该值时使用 a 以确保不会出现并发问题。之后,当您开始在单独的线程上处理时,将值设置为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();
    }
}
于 2012-10-03T14:39:31.550 回答