0

WPF で長時間の操作を実行するタスクがあります。

Task t = Task.Factory.StartNew(() =>
{
    try
    {
        process(cancelTokenSource.Token, CompressionMethod, OpInfo);
    }
    catch (OperationCanceledException)
    {
        logger.Info("Operation cancelled by the user");
    }
}, cancelTokenSource.Token);

try
{
    t.Wait();
}
catch (AggregateException ae)
{
    int i = 0;
}     


private void process(CancellationToken token, CompressionLevel level, OperationInfo info)
{
    // check hash
    if (ComputeHash)
    {
        logger.Info("HASH CHECKING NOT IMPLEMENTED YET!");
        MessageBox.Show(this,"HASH CHECKING NOT IMPLEMENTED YET!", "WARNING", MessageBoxButton.OK, MessageBoxImage.Warning);
    }
    token.ThrowIfCancellationRequested();
    UserMsgPhase = "Operation finished";

    return info;
}

問題は、「MessageBox.Show」が例外をスローし、「catch (AggregateException ae)」内にキャプチャされないことです。TPL 例外処理について読んでいますが、なぜキャッチされないのかわかりません。助けてください。

4

3 に答える 3

2

タスクが完了すると、その Exception プロパティを確認できます。また、便利な Status および IsCompleted プロパティもあります...

于 2013-11-11T16:46:41.863 に答える
0

Task.Exceptionを確認してください。タスクが入力されている (結果を返す) 場合、myTask.Result にアクセスすると、この例外がスローされます。

さらに、.Net 4.5 を実行している場合は、async/await を使用できます。

例として:

public async void MyButton_OnClick(object sender, EventArgs e)
{
    try
    {
        Task t = ...your task...;
        var myResult = await t; // do whatever you like with your task's result (if any)
    }catch
    {
        // whatever you need
    }
}

同期コードで行うように (ただし、これは実際の同期呼び出しではありません)

于 2013-11-11T17:16:30.240 に答える