我有一个托管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中。