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

Dar*_*rov 23 c# multithreading

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

cdi*_*ins 26

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

例如:

public class ClassCreatedBySomeThread
{
    Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

    public void SafelyCallMeFromAnyThread(Action a)
    {
       dispatcher.Invoke(a);
    }
} 
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 12

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

我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><title>ActiveXRunner</title>    
    <script type="text/javascript">
    function runNotepad() {
        var ax = new ActiveXObject('ActiveXRunner.Runner');
        ax.Run('c:\\windows\\notepad.exe', h);
    }

    function h(exitCode) {
        alert('exitCode = ' + exitCode);
    }
    </script>
</head>
<body>
    <a href="#" onclick="runNotepad();">Run notepad and show exit code when finished</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 11

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

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