可以指定使用delegate.BeginInvoke时AsyncCallback运行的线程吗?

YWE*_*YWE 8 .net c# multithreading

根据我对.NET的理解,如果我使用BackgroundWorker并为RunWorkerCompleted提供事件处理程序,则事件处理程序将在调用RunWorkerAsync的同一线程上运行.相反,如果我在委托上使用BeginInvoke来异步运行一个方法,并将AsyncCallback参数传递给BeginInvoke,有没有什么方法可以指定回调在调用BeginInvoke的同一个线程上运行 - 或者对于任何任意线程?根据我的理解,回调运行在线程池的下一个可用线程上.这很好,但有没有办法在我想要的任何线程上运行AsyncCallback中的代码?我知道你可以在表单或控件上使用BeginInvoke,并在创建UI元素的线程上的回调运行中创建代码.但是,如果我想在没有表单或控件的非UI线程上运行代码呢?

Joh*_*ler 6

在你想要的对象而你的异步操作使用线程时,CurrentDispatcher属性是可以用来强制回调到该线程执行System.Threading.Dispatcher对象.

这是Control类用于实现BeginInvoke的基类.

关于在Windows窗体中使用它的问题已经出现.我不认为这会是一个问题,虽然如果你有一个表单,那么form.BeginInvoke是一个更好的选择.看起来表单和WPF都使用相同的基类来处理调用. http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx


Jef*_*Cyr 5

Delegate.BeginInvoke将始终在ThreadPool中执行委托,并在执行委托的同一线程上调用AsyncCallback.

您唯一的选择是重新调用特定线程上的回调:

AsyncCallback = delegate (IAsyncResult ar)
{
    wathever.BeginInvoke(delegate
    {
        // Do your stuff...
    };
};
Run Code Online (Sandbox Code Playgroud)

  • 不,我的意思是当你从线程A调用Delegate.BeginInvoke时,这个委托在ThreadPool中的线程B上执行,然后在线程B上调用AsyncCallback. (4认同)