1

我一直认为我可以使用 SynchronizationContext 来编组对另一个线程的调用。显然我错了,因为 SyncCtx.Send() 除了调用给定的委托(保持在同一个线程上)之外什么都不做。我真的需要从 SynchronizationContext 派生并在线程上下文上工作吗?我感觉好像错过了什么。

我想要实现的目标:想象一个用于在应用程序中执行命令的小 API。您还可以在后台线程上执行命令,因为您可以分配一个委托以在命令完成执行时运行。这个“Call-me-when-done”-Delegate 获得一个包含成功/失败标志、可选异常信息等的单个参数(状态)。我想在原始调用线程上调用这个委托,这样使用 lib 的开发人员就不会需要处理所需的调用等。我只想把它拿走,让他们做简单的非线程感知编程。如果您不给它一些控制作为目标,WindowsFormsSynchronizationContext 似乎也无济于事。

谢谢你的帮助!

4

1 回答 1

0

当您在 winforms 中并使用同步上下文时,调用将被编组到 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"));
于 2011-12-19T09:00:18.793 回答