框架,比如线程编组

本文关键字:线程 框架 | 更新日期: 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"));