Ответ 1
ОБНОВЛЕНО: Чтобы наблюдать за исключением в другом потоке, вы хотите использовать Task
, поставить его в очередь Dispatcher
(используя TaskScheduler.FromCurrentSynchronizationContext
) и ждать на нем, как таковой:
var ui = TaskScheduler.FromCurrentSynchronizationContext();
Action doit = () =>
{
var error = Task.Factory.StartNew(
() => { throw new InvalidOperationException("test"); },
CancellationToken.None,
TaskCreationOptions.None,
ui);
try {
error.Wait();
} catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex);
}
};
doit.BeginInvoke(null, null);
ОБНОВЛЕНО (снова):. Поскольку ваша цель - компонент многократного использования, я рекомендую перейти на интерфейс Task
или что-то еще на основе SynchronizationContext
, например асинхронный шаблон на основе событий вместо того, чтобы основывать компонент на Dispatcher
или ISynchronizeInvoke
.
Dispatcher
работают только с WPF/Silverlight; Компоненты, основанные на ISynchronizeInvoke
, работают только с Windows Forms. Компоненты, основанные на SynchronizationContext
, будут работать с WPF или Windows Forms прозрачно и (с немного большей работой) ASP.NET, консольные приложения, службы Windows и т.д.
Асинхронный шаблон на основе событий является старым рекомендуемым способом написания компонентов SynchronizationContext
; он все еще используется для кода .NET 3.5. Однако, если вы используете .NET 4, параллельная библиотека задач намного более гибкая, чистая и мощная. TaskScheduler.FromCurrentSynchronizationContext
использует SynchronizationContext
под ним и является новым способом записи повторно используемых компонентов, которым требуется такая синхронизация.