在不阻止应用程序的情况下运行NSAlert应用程序模式

时间:2019-04-01 13:01:02

标签: c# multithreading macos user-interface xamarin

我有一个托管finder扩展程序的应用程序。此扩展程序从主机应用程序请求数据。

在运行工作线程时,我需要通过NSAlert模式要求用户提供反馈。调用主线程并显示模式框会阻止整个应用程序,从而防止finder扩展程序请求数据。

我的应用程序结构如下:  1个应用程序线程  1个线程,用于监听CFMessagePort  1个用于运行文件监视程序的线程  1个线程执行后台工作

,以及正在运行的finder扩展程序作为客户端应用程序。

创建工作线程

myWorker = new BackgroundWorker();
myWorker.WorkerSupportsCancellation = true;
myWorker.DoWork += new DoWorkEventHandler(delegate(Object o, DoWorkEventArgs args) {
// Time consuming task
// which may require user feedback
});

在工作进程内部,调用一个事件,该事件稍后在应用程序的特定于操作系统的部分中处理。

System.Threading.AutoResetEvent waitHandle = new System.Threading.AutoResetEvent(false);
controller.ConflictOccured ? .Invoke(this, new ConflictEventArgs {
 Type = ConflictType.LocalFolderDeleted, OnResolve = (userChoice) => {
   // Do something else
   waitHandle.Set();
  }
 }
});

// Wait until conflict event has been handled
waitHandle.WaitOne();

处理事件,运行模式。

private void HandleMyConflict(object sender, ConflictEventArgs eventArgs) {
 // Invoking the UI thread
 NSApplication.SharedApplication.BeginInvokeOnMainThread(() => {
  var conflictAlert = new NSAlert() {
   AlertStyle = NSAlertStyle.Warning, MessageText = "Foo", InformativeText = "Bar",
  };
  conflictAlert.AddButton("Foo");
  conflictAlert.AddButton("Bar");

  // Run the actual modal - this blocks everything
  nint userResponse = conflictAlert.RunModal();

  // Determine the user choice

  // Resolve event by invoking callback
  eventArgs.OnResolve(choice);
 });
}

我希望模态自从处理事件以来就阻塞了主应用程序线程,而不是监视程序和侦听器线程。后者位于完全不同的ThreadPool中。

0 个答案:

没有答案