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

如何在.NET中调用父线程上的函数?

如何解决《如何在.NET中调用父线程上的函数?》经验,为你挑选了3个好方法。

我有一个.NET类库,其中包含一个类,该类具有执行一些冗长操作的方法.当客户端调用此方法时,它应该对新线程执行冗长的操作,以避免阻塞调用者.但是一旦方法完成,它应该在主线程上执行一些代码.在WinForms应用程序中,我可以使用System.Windows.Forms.Control.Invoke方法,但这不是我的情况.那么我怎样才能在C#中实现这一目标?



1> cdiggins..:

您可以使用System.Windows.Threading.Dispatcher对象(来自WindowsBase程序集)在特定线程上调用函数.

例如:

public class ClassCreatedBySomeThread
{
    Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

    public void SafelyCallMeFromAnyThread(Action a)
    {
       dispatcher.Invoke(a);
    }
} 



2> Darin Dimitr..:

我找到了一个解决问题的简单方法:

我的COM对象声明如下:

public class Runner
{
    public void Run(string executable, object processExitHandler)
    {
        ThreadPool.QueueUserWorkItem(state =>
        {
            var p = new Process()
            {
                StartInfo = new ProcessStartInfo()
                {
                    FileName = executable
                }
            };
            p.Start();
            while (!p.HasExited)
            {
                Thread.Sleep(100);
            }

            state
                .GetType()
                .InvokeMember(
                    "call", 
                    BindingFlags.InvokeMethod, 
                    null, 
                    state, 
                    new object[] { null, p.ExitCode }
                );
        }, processExitHandler);
    }
}

在我的HTML页面中,我使用它:



ActiveXRunner    
    


    Run notepad and show exit code when finished




3> Jon Skeet..:

如果一个线程必须能够执行另一个线程发布给它的一些代码(通常以委托的形式),它必须基本上等待那些指令.你的主线程还在做什么?构建等效的事件循环并不难(基本上你有一个代理的生产者/消费者队列),但是你需要知道你不能只是打断主线程并说"现在就做".

为什么必须在主线程上执行?

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