当前位置:  开发笔记 > 编程语言 > 正文

调用跨线程事件的最简洁方法

如何解决《调用跨线程事件的最简洁方法》经验,为你挑选了3个好方法。

我发现.NET事件模型是这样的,我经常会在一个线程上引发事件并在另一个线程上侦听它.我想知道将后台线程中的事件编组到我的UI线程的最简洁方法是什么.

根据社区建议,我用过这个:

// earlier in the code
mCoolObject.CoolEvent+= 
           new CoolObjectEventHandler(mCoolObject_CoolEvent);
// then
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    if (InvokeRequired)
    {
        CoolObjectEventHandler cb =
            new CoolObjectEventHandler(
                mCoolObject_CoolEvent);
        Invoke(cb, new object[] { sender, args });
        return;
    }
    // do the dirty work of my method here
}

Domenic.. 43

我在网上有一些代码.它比其他建议好得多; 绝对检查一下.

样品用法:

private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    // You could use "() =>" in place of "delegate"; it's a style choice.
    this.Invoke(delegate
    {
        // Do the dirty work of my method here.
    });
}


Shaun Austin.. 27

几点意见:

不要在类似的代码中显式创建简单的委托,除非你是pre-2.0,所以你可以使用:

   BeginInvoke(new EventHandler(mCoolObject_CoolEvent), 
               sender, 
               args);

此外,您不需要创建和填充对象数组,因为args参数是"params"类型,因此您只需传入列表即可.

我可能会赞成Invoke,BeginInvoke因为后者将导致代码被异步调用,这可能会或可能不是你所追求的,但会使后续异常难以传播而不需要调用EndInvoke.会发生什么事情,你的应用程序将最终得到一个TargetInvocationException.


Konrad Rudol.. 10

我避免冗余的代表声明.

private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    if (InvokeRequired)
    {
        Invoke(new Action(mCoolObject_CoolEvent), sender, args);
        return;
    }
    // do the dirty work of my method here
}

对于非事件,您可以使用System.Windows.Forms.MethodInvoker委托或System.Action.

编辑:此外,每个事件都有一个相应的EventHandler代表,所以根本不需要重新声明一个.



1> Domenic..:

我在网上有一些代码.它比其他建议好得多; 绝对检查一下.

样品用法:

private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    // You could use "() =>" in place of "delegate"; it's a style choice.
    this.Invoke(delegate
    {
        // Do the dirty work of my method here.
    });
}



2> Shaun Austin..:

几点意见:

不要在类似的代码中显式创建简单的委托,除非你是pre-2.0,所以你可以使用:

   BeginInvoke(new EventHandler(mCoolObject_CoolEvent), 
               sender, 
               args);

此外,您不需要创建和填充对象数组,因为args参数是"params"类型,因此您只需传入列表即可.

我可能会赞成Invoke,BeginInvoke因为后者将导致代码被异步调用,这可能会或可能不是你所追求的,但会使后续异常难以传播而不需要调用EndInvoke.会发生什么事情,你的应用程序将最终得到一个TargetInvocationException.



3> Konrad Rudol..:

我避免冗余的代表声明.

private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args)
{
    if (InvokeRequired)
    {
        Invoke(new Action(mCoolObject_CoolEvent), sender, args);
        return;
    }
    // do the dirty work of my method here
}

对于非事件,您可以使用System.Windows.Forms.MethodInvoker委托或System.Action.

编辑:此外,每个事件都有一个相应的EventHandler代表,所以根本不需要重新声明一个.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有