2

ContinueWith()私たちのチームは、ホスト プロセスがシャットダウンするまで実行できないという問題を抱えています。たとえば、以下のコードは、本番環境で 1 年間問題なく動作しています。しかし、新しいバージョンのフレームワークを使い始めてから、この問題が発生しました。

このコードをthis.Sites = GetViewableSites();実行すると、実行され、デバッグ時に他に何も起こりません。を押した後F10、デバッガーは UI に戻ります。ユーザーが UI を閉じた後にのみ、ContinueWith()実行が行われます。

this.PerformBusyAction(() =>
{
    this.Sites = GetViewableSites();
}, ViewModelResource.LoadingForm)
.ContinueWith(originatingTask =>
{
    // ** This doesn't execute until the user closes the UI **
    if (originatingTask.Exception == null)
    {
        PerformPostSuccessfulInitialization();
        return;
    }
    PerformPostUnsuccessfulInitialization(originatingTask.Exception.InnerExceptions);
});

完全を期すために、次のPerformBusyAction()とおりです。

    protected Task PerformBusyAction(Action action, string busyMessage)
    {
        this.BusyMessage = busyMessage;
        this.IsBusy = true;  // Let the UI know we're busy, so it can display a busy indicator

        var task = Task.Factory.StartNew(() =>
        {
            try
            {
                action();
            }
            finally
            {
                this.IsBusy = false;
                this.BusyMessage = String.Empty;
            }
        });

        return task;
    }

何が原因でしょうか?原因は私たちのフレームワークにあると言えますし、そうかもしれませんが、これがどのように起こる可能性があるかを理解することはできませんでした. この問題を回避するために、使用を中止しContinueWith()、すべてのコードを最初のセクション/タスクに配置しました。

編集

おそらくこれはバグですか?とはいえ、ここにも同様の問題がありConsole.ReadKey()ます。

編集 2 - GetViewableSites() を呼び出した直後のコール スタック

フラグなし > 6324 6 ワーカー スレッド ワーカー スレッド Acme.Mes.Apps.Derating.ViewModels.Controls.GlobalTabControlViewModel.Initialize.AnonymousMethod__9 通常 Acme.Mes.Apps.Derating.ViewModels.dll!Acme.Mes.Apps.Derating.ViewModels.Controls .GlobalTabControlViewModel.Initialize.AnonymousMethod__9() 行 361
Acme.Mes.Client.dll!Acme.Mes.Client.Mvvm.MvvmTools.ViewModelBase.PerformBusyAction.AnonymousMethod__c() 行 494 + 0xe バイト
mscorlib.dll!System.Threading.Tasks. Task.InnerInvoke() + 0x49 バイト
mscorlib.dll!System.Threading.Tasks.Task.Execute() + 0x2e バイト
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj) + 0x15 バイト
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクト状態、bool preserveSyncCtx) + 0xa7 バイト
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading .ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクト状態、bool preserveSyncCtx) + 0x16 バイト
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot) + 0xcb バイト
mscorlib.dll !System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) + 0xb3 バイト
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x7 バイトmscorlib.dll !
System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x149 バイト
PerformWaitCallback() + 0x5 バイト
[マネージド トランジションにネイティブ]

4

1 に答える 1

0

ディスパッチャーを使用して、IsBusy および BusyMessage にアクセスしてみてください。

Dispatcher.BeginInvoke((Action) (() =>
    {
        this.IsBusy = false;
        this.BusyMessage = String.Empty;
    }));
于 2013-10-02T04:45:54.427 に答える