线程完成时回调执行

时间:2012-10-03 09:43:05

标签: multithreading c#-4.0 callback

免责声明(完全可编辑/可移动)

我已完成了我的作业,但据我所知,我看不出我想知道的事情(这有点令人惊讶,所以我确信这是一个善良的灵魂将标记为重复 - 请提前接受我的道歉,哈哈)。

背景和预期问题

当我启动Outlook时,我正在从CRM Dynamics执行更新,这需要一段时间。所以,我决定将更新放在一个帖子中。它的工作原理应该是功能区上有一个按钮,允许用户手动调用更新。预计一个疯狂的用户,我意识到有人点击之前的按钮原始更新完成后,所有类型的排泄物都可能会遇到气体再分配设备。

建议的解决方案

为了避免这种情况,我按照以下方式设置了私有财产。

private bool KeepYourPantsOn { get; set; }

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

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

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

实施问题

我的注意事项是,我没有找到任何OnFinishedWhenDone等方法来调用以切换KeepYourPantsOn的值。此外,我还没有真正看到任何建议的解决方案如何解决(或者说 - 我没有感知任何解决方案 - 我可能已经看到一个没有意识到这是因为无知在线程编程领域内。)

2 个答案:

答案 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();
    }
}