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
如果一个线程必须能够执行另一个线程发布给它的一些代码(通常以委托的形式),它必须基本上等待那些指令.你的主线程还在做什么?构建等效的事件循环并不难(基本上你有一个代理的生产者/消费者队列),但是你需要知道你不能只是打断主线程并说"现在就做".
为什么必须在主线程上执行?
归档时间: |
|
查看次数: |
26629 次 |
最近记录: |