У меня есть форма прогресса, которую я использую для выполнения задач, переданных ей асинхронно.В основном весь код формы:
public ProgressForm(IEnumerable<KeyValuePair<string, Action>> tasks)
{
InitializeComponent();
this.tasks = tasks;
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
PerformTasks(tasks);
}
private async void PerformTasks(IEnumerable<KeyValuePair<string, Action>> tasks)
{
tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
try
{
await Task.Run(() =>
{
foreach (var task in tasks)
{
token.ThrowIfCancellationRequested();
task.Value();
}
}, token);
isTaskCompleted = true;
}
catch (OperationCanceledException oex) when (oex.CancellationToken == token)
{ }
catch
{
throw;
}
finally
{
tokenSource.Dispose();
DialogResult = isTaskCompleted ? DialogResult.OK : DialogResult.Cancel;
Close();
}
}
Затем я вызываю форму с задачей следующим образом:
try
{
using (var progress = new ProgressForm(() =>
{
SomeLongRunningTask();
}))
{
progress.ShowDialog();
};
}
catch (MyException ex)
{
//Do something
}
SomeLongRunningTask
выдает исключение типа MyException
.Вместо того, чтобы перехватывать включающий блок try/catch
, он перехватывается обработкой исключений основного потока:
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
Application.Run();
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
//Do something
}
Почему исключение не перехватывается в правильном месте, и как я могу это сделать?заставить его попасть в этот блок?