2017-03-01 4 views
1

私は非同期メソッドを使用するのが初めてであるため、何かを誤解していると思います。私はボタン付きのWinFormsアプリケーションを持っています。ボタンをクリックすると、非同期メソッドが呼び出されます。私はChromium Webブラウザコントロール(CefSharpを使用)にjavascript呼び出しを行う必要があるので、これは非同期でなければなりません。このjavascriptの実行が終了し、メソッドの次の部分を続行する前にブラウザが更新されていることを確認する必要があります。非同期メソッドを使用して次のコード行が実行されないようにする

私は基本的に1つの画像にウェブページ全体をキャプチャしようとしています。私のアプローチは、javascriptを使用してページのスクロール位置を更新し、Graphics.CopyFromScreenを使用して各位置でスクリーンショットを取得することでした。これは主に動作しますが、結果の画像に間違ったウェブページのチャンクが含まれることがあります(たとえば、最初のビットマップが2回繰り返されます)。ここに私のコードは次のとおりです。私はEvaluateScriptAsync()呼び出しの後

await Task.Delay(1000); 

以下を追加した場合

// Calculate screen sizes, screenshot spacing etc. 

for (int i = 0; i < screenshotCount; i++) 
{ 
    int scrollSize = i == 0 ? -PageHeight : (int)browserControlHeight; 
    string script = "(function() { window.scrollBy(0, " + scrollSize.ToString() + ") })();"; 

    await browser.EvaluateScriptAsync(script); 

    // Take screenshot, add to list of bitmaps 
} 

// Combine resulting list of bitmaps 

、最終的なイメージは正しい毎回出てきます。私は、javascriptが呼び出されているが、スクリーンショットが始まる前に完了していないという前提で作業しています。この場合、遅延を追加しても機能しない場合があります(javascriptの実行に1秒以上かかる場合はどうなりますか?)。

私はasync/awaitの仕組みを誤解していますか?

答えて

5

いいえ、問題はawaitではありません。続行する準備が整う前にから返されたEvaluateScriptAsyncが完了としてマークされています。スクロールコマンドを送信した後にブラウザが画面のレンダリングを完了した後、完了したとマークされるのではなく、スクロールが実行されるべきであることをブラウザに知らせるとすぐに、完了したとマークされます。

+0

JavaScriptを実行するために余分な行を追加してtrueを返すだけで問題は解決しますか? javascriptでは、スクロールが完了するまで次の行が実行されないと仮定します。 – jardantuan

+1

@ジャルダントゥン第2の仮定は真実ではない。それが最初の問題の根源です。その前提が真であれば、あなたのコードは既に動作しています。 – Servy

+0

これは意味があります。現時点では、スクロール位置が変更されたかどうかを確認するjavascriptにチェックを追加して、何かを返すことができると思っています。私ははるかに明白な修正をしていない可能性もあります。 – jardantuan

関連する問題