微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – BeginInvoke的性能影响

我继承了从主线程调用BeginInvoke的代码(不是后台线程,通常是模式).我试图了解它在这种情况下的实际作用.

在BeginInvoke中调用方法是否符合到窗口的消息?文档说是异步的,所以这是我的假设.

框架如何确定何时启动BeginInvoke调用方法

编辑:代码如下所示:

System.Action<bool> finalizeUI = delegate(bool open)
{
    try
    {
        // do somewhat time consuming stuff
    }
    finally
    {
        Cursor.Current = Cursors.Default;
    }
};

Cursor.Current = Cursors.WaitCursor;
BeginInvoke(finalizeUI,true);

这发生在Form_Load事件中.

解决方法

编辑

现在我们看到了代码,很明显这只是一种将一些初始化移出Form_Load的方法,但在用户可以与表单交互之前仍然会发生这种情况.

对BeginInvoke的调用在Form_load中,并且不在另一个对象上调用,因此这是对Form.BeginInvoke的调用.所以这是怎么回事.

> Form_Load将委托传递给Form.BeginInvoke,这会在表单的消息队列中放置一条消息,该消息排在所有用户输入消息之前.它将光标设置为等待光标.
> Form_Load返回,并允许表单初始化的其余部分完成,此时表单很可能变为可见.
>一旦代码落入消息泵,首先在队列中看到的是委托,所以它运行它.
>当委托完成时,它将光标更改回正常光标,然后返回
>利润!

原帖在下面

我依赖于你调用BeginInvoke的对象.如果对象派生自Control,则Control.BeginInvoke将在创建控件的线程上运行.见JaredPar的回答.

但是使用BeginInvoke还有另一种模式.如果对象是委托,则BeginInvoke在单独的线程上运行回调,该线程可以专门为此目的创建.

public class Foo
{
    ...
    public Object Bar(object arg)
    {
       // this function will run on a separate thread.
    }
}

...

// this delegate is used to Invoke Bar on Foo in separate thread,this must
// take the same arguments and return the same value as the Bar method of Foo
public delegate object FooBarCaller (object arg);

...

// call this on the main thread to invoke Foo.Bar on a background thread
//
public IAsyncResult BeginFooBar(AsyncCallback callback,object arg)
{
   Foo foo = new Foo();
   FooBarCaller caller = new FooBarCaller (foo.Bar);
   return caller.BeginInvoke (arg);
}

此模式是从主线程而不是从后台线程调用BeginInvoke的一个原因.

原文地址:https://www.jb51.cc/csharp/239204.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐