-1

C#/XAML アプリのバックグラウンド スレッドで実行する必要があるアクティビティがあるため、次のようにしています。

Task.Factory.StartNew(() => ImportFile());

スレッドベースの作業が完了したにアクションを実行する必要がある別のコードに Task 値を返しています。コードは次のようになります。

Action<Task> finalise = async delegate { await FinishImport(dbList); };
dbList.ImportFileAsync().ContinueWith(finalise);

ただし、コードをFinishImport実行すると、バックグラウンド スレッドが終了する前にデバッグ ステートメントが実行されます。

ここで私は何を誤解していますか?ContinueWith目的のタスクが完了した後に継続コードを実行することがポイントだと思いました。

4

2 に答える 2

1

コードでTask.Runはなく使用する必要があります。はメソッドを理解し、そのメソッドの先頭のみを表すを返します。Task.Factory.StartNewasyncTask.RunasyncStartNewTaskasync

補足として、通常Task.Runはライブラリ メソッド内に非表示にしないことをお勧めします。

awaitまた、よりもはるかに使いやすいですContinueWith。また、asyncメソッドは「Async」で終了する必要があります。

したがって、これらのガイドラインを適用すると、コードは次のようになります。

await Task.Run(() => dbList.ImportFileAsync());
await FinishImportAsync(dbList);
于 2013-06-30T17:22:00.637 に答える
0

ImportFileAsync()が?

finaliseのスレッドImportFileAsync()が終了した後に実行されます

もしも ImportFileAsync(){ Task.Factory.StartNew(() => ImportFile());}

その後ImportFileAsync、新しいスレッドを呼び出して から終了し、終了ImportFile()するのを待ちませんImportFile()

あなたがしたい

Task.Factory.StartNew(() => dbList.ImportFile()).ContinueWith(finalise);

于 2013-06-30T12:48:56.547 に答える