框架,比如线程编组
本文关键字:线程 框架 | 更新日期: 2023-09-27 18:18:28
我一直认为我可以使用SynchronizationContext来封送对另一个线程的调用。显然我错了,因为SyncCtx.Send()除了调用给定的委托(保持在同一线程上)之外什么都不做。我真的需要从SynchronizationContext中派生并在线程上下文上工作吗?我觉得好像错过了什么。
我想实现的:想象一下在应用程序中执行命令的小API。你也可以在后台线程中执行命令,因为你可以在命令完成执行时分配一个委托来运行。这个"完成后调用我"的委托获得一个参数(状态),其中包含成功/失败标志,可选异常信息等。我想在原始调用线程上调用此委托,以便使用lib的开发人员不需要处理所需的调用等。我只是想把这个拿走,让他们做简单的非线程感知编程。如果你不给它一些控制作为目标,WindowsFormsSynchronizationContext似乎也没有帮助。
谢谢你的帮助!
当您在winforms中使用synchronizationcontext时,调用将被封送到GUI线程。
对于你的具体情况,我想这样的东西应该工作,也许这将是一个好主意,创建一个类,代表一个Command
public class CommandManager
{
private readonly SynchronizationContex _synchronizationContex;
public CommandManager(SynchronizationContext synchronizationContex)
{
_synchronizationContex = synchronizationContex;
}
public void ExecuteAsync(Func<State> action, Action<State> callback)
{
ThreadPool.QueueUserWorkItem(o => {
state = action();
_synchronizationContex.Send(oo => callback(state));
});
}
}
您可以这样创建(在GUI线程中,例如在主表单中)
var commandManager = new CommandManager(SynchronizationContext.Current);
你可以这样使用:
commandManager.ExecuteAsync(() => new State() { Success = true },
c => MessageBox.Show("success in the GUI thread"));