我有一个.NET类库,其中包含一个类,该类具有执行一些冗长操作的方法.当客户端调用此方法时,它应该对新线程执行冗长的操作,以避免阻塞调用者.但是一旦方法完成,它应该在主线程上执行一些代码.在WinForms应用程序中,我可以使用System.Windows.Forms.Control.Invoke方法,但这不是我的情况.那么我怎样才能在C#中实现这一目标?
您可以使用System.Windows.Threading.Dispatcher
对象(来自WindowsBase程序集)在特定线程上调用函数.
例如:
public class ClassCreatedBySomeThread { Dispatcher dispatcher = Dispatcher.CurrentDispatcher; public void SafelyCallMeFromAnyThread(Action a) { dispatcher.Invoke(a); } }
我找到了一个解决问题的简单方法:
我的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
如果一个线程必须能够执行另一个线程发布给它的一些代码(通常以委托的形式),它必须基本上等待那些指令.你的主线程还在做什么?构建等效的事件循环并不难(基本上你有一个代理的生产者/消费者队列),但是你需要知道你不能只是打断主线程并说"现在就做".
为什么必须在主线程上执行?