-1

我的应用程序使用 UI 线程和另一个线程在后台执行操作,并使用这些操作的结果更新 UI。

这一切都很好。但是,在一项操作中,我需要要求用户输入一些值。顺序:

  • UI线程运行
  • 命令-> 启动的第二个线程(我们称之为工作线程)在后台工作
  • 工作线程在按顺序执行操作时向 UI 发送状态信息
  • 在一个特定操作期间,工作线程被停止
  • 发送一条消息,必须显示视图,以便用户选择一个选项
  • UI 线程订阅了这种类型的消息,所以它显示了一个视图
  • 用户完成选择,并关闭视图
  • 工作线程接收用户选择,并继续执行
  • 工作线程完成

开始新主题的代码:

Thread thread = new Thread(Convert);
thread.SetApartmentState(ApartmentState.STA); // avoid "The calling thread must be STA" exception
thread.Start();

将状态信息从工作线程发送到 UI 线程的代码:

Application.Current.Dispatcher.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.Normal,
    (Action<OperationStatus>)delegate(OperationStatus operation)
        {
            OperationList.Add(operation);
        }, status);

要求用户确认的代码:

在 MainViewModel 中,工作线程执行期间:

// create ViewModel, that will be used as DataContext for dialog view
var vm = new SelectOptionViewModel(OptionList);
// subscribe to Close event, to get user selection
vm.Close += (s, e) =>
{
    _option = vm.SelectedOption;
};

AppMessages.DialogScreen.Send(vm);

在 MainView 中,在工作线程执行期间:

AppMessages.DialogScreen.Register(this, vm =>
    {
        SelectOptionView view = new SelectOptionView();
        view.DataContext = vm;
        // view.Owner = this; // raises exeption about cross-threading
        view.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
        view.ShowDialog();
    });

问题是如何将对话框视图设置为在父视图(MainView)中居中显示?无法将 view.Owner 设置为“this”,因为“this”是在 UI 线程上创建的。

我应该在此处更改什么以在我的应用程序中居中对话框视图,同时保留定义的序列顺序?

4

2 回答 2

1

您是否考虑过使用后台工作人员

于 2012-08-31T18:26:12.097 回答
0

哪个线程在创建对话框的地方执行注册的 labda?

它必须是 UI 线程。

如果您想在 UI 上下文中执行一些代码并将结果返回到工作线程,您可以使用 SynchronizationContext 和 Task

See the example here, please.

于 2012-09-01T06:49:11.703 回答