2016-09-29 3 views
2
private async void ProgressDialog_Opened(ContentDialog sender, ContentDialogOpenedEventArgs args) 
{ 
    ProgressDialog p = sender as ProgressDialog; 
    await DoCopyingAsync(p); 
} 

私は非同期voidメソッドで待っているときに悪いことが起こることを知っています。どうすれば私のコードを変更できますか?これは '待機可能'である 'トップレベルイベントハンドラ'ではなく、呼び出し後に起動されます「トップレベル」ではないイベントハンドラでタスクを待つことを避けるには?

await progressDialog.ShowAsync();

事前に感謝します。

+0

イベントハンドラで待つのは大丈夫です。例えば、これを見てください:http://stackoverflow.com/a/19415703/2704659 –

+0

これは疑問ではありませんか?!! –

+1

@ rory.ap一般的なイベントハンドラ*で待つのは大丈夫です。これは、同期コンテキストがあり、そのすべてがどのように機能するかについての良い考えがある場合にのみ適用されます。 WinFormsでは、これはすべてWinFormsの同期コンテキストで処理されるため、通常はWinFormsスレッドのUIイベントを待つのが安全です。 – Luaan

答えて

2

私は進捗ダイアログがコピーを担当すべきではないと思っています。コピーは進捗ダイアログについて何も知らないはずです。

async void StartCopy_Click(object sender, RoutedEventArgs e) 
{ 
    var progressDialog = new ProgressDialog(); 
    var progress = new Progress<int>(percent => progressDialog.Percent = percent); 
    Task copyTask = DoCopyingAsync(progress); 
    Task showProgressTask = progressDialog.ShowAsync(); 
    await copyTask; 
    progressDialog.Hide(); 
    await showProgressTask; 
} 
+0

こんにちは@piedar、本当にここのアイデアが好きです。あなたの提案を反映するために自分のコードを修正しましたが、悲しいことにProgressDialogはコードがデッドロック状態にあるかのようにハングします。私が使用しているコードは次のとおりです:ProgressDialog progressDialog = new ProgressDialog(); var progress = new進捗(パーセント=> progressDialog.Percent =パーセント); を待ちます。Task.WhenAnd(progressDialog.ShowAsync()。AsTask()、DoCopying(progress、storageFiles)); progressDialog.Hide(); – Cleve

+0

DoCopyingの実装をTask.Delay(..)を待つだけに変更しても、それはまだハングするので、それはできません。 – Cleve

+0

私はdoCopying内でprogressDialog.Hideを呼び出してハングを修正し、これによりShowAsyncが完了します。 – Cleve

関連する問題