Cefsharp: 機能リクエスト-非同期Javascriptバインディングタスクを返すためのサポートを追加

作成日 2019年05月06日  ·  4コメント  ·  ソース: cefsharp/CefSharp

  • 使用している製品のバージョンは何ですか?
    73.1.130

  • x86またはx64のアーキテクチャは何ですか?
    システムアーキテクチャ-x64、問題は両方のプログラムアーキテクチャに存在します

  • どのオペレーティングシステムで?
    Win10

  • WinFormsWPF 、またはOffScreenを使用していますか?
    WPF

  • 問題を再現する手順は何ですか?
    asyncメソッドを持つ単純なオブジェクトをバインドします。 Javascriptからメソッドを実行します。
    https://gist.github.com/perf2711/e96e69abad24c254d0192e88eb705709
    index.htmlファイルをpython3 -m http.server 8000でホストしました。

  • 期待される出力はどれくらいですか?

同期メソッドは正常に機能し、同期コンテキストで非同期メソッドの結果を待機します。 asyncメソッドを実行すると、何も返されず、promiseは解決されず、オブジェクトは「ロックアップ」して、追加の呼び出しを防ぎます。

このコードは、開発者コンソール内で実行されました。

>await TestBoundObject.syncMethod()
"SyncMethod"
>await TestBoundObject.syncMethod1()
"AsyncMethod1"
>await TestBoundObject.syncMethod2()
"AsyncMethod2"
>await TestBoundObject.syncMethod3()
"AsyncMethod3"
>await TestBoundObject.asyncMethod1()
>await TestBoundObject.asyncMethod2()
>await TestBoundObject.asyncMethod3()
>await TestBoundObject.syncMethod()
  • 以下に追加情報を入力してください。
    例外はスローされません。 各関数のブレークポイントがトリガーされます。
    General usage asyncメソッドを使用しないことに関する情報はありませんが、そのような場合の例はありません。

  • この問題は、http://opensource.spotify.com/cefbuilds/index.htmlのCEFサンプルアプリケーションでも発生しますか?
    いいえ、少なくともJavascript Bindingテストではありません。 とにかく、この問題はサンプルアプリでは再現できないと思います。

enhancement feature-request pr-merged

最も参考になるコメント

https://github.com/cefsharp/CefSharp/pull/2771にサポートが追加されました。 QUnitのテストケースがいくつかあります。対処する必要のある失敗したケースがある場合は、 PRを送信してください。 。

ChromiumWebBrowserインスタンスを作成する前に、以下を設定する必要があります。 以下を有効にせずにTaskを返そうとすると、詳細なエラーメッセージが表示されます。

この機能は、オブジェクトを非同期として登録する場合にのみ使用できます(例: isAsync: true

`` `c#
CefSharpSettings.ConcurrentTaskExecution = true;

#### Example

```c#
public async Task<string[]> AsyncDownloadFileAndSplitOnNewLines(string url)
{
    var webClient = new WebClient();
    var download = await webClient.DownloadStringTaskAsync(new Uri(url));

    var lines = download.Split('\n').Where(x => !string.IsNullOrEmpty(x.Trim())).ToArray();

    return lines;
}
const url = "https://raw.githubusercontent.com/cefsharp/CefSharp/master/.editorconfig";

boundAsync.asyncDownloadFileAndSplitOnNewLines(url).then(function (lines)
{
    //Do something with the result.
});

全てのコメント4件

現在サポートされていないため、例はありません。この場合、名前は少し誤解を招く可能性があります。 方程式のJavaScript側のみが実際には非同期です。 この機能を実装するのは難しいので、プルリクエストを送信してください。

長時間実行タスクを実行するために現在サポートされている方法は、コールバックを使用することです。https://github.com/cefsharp/CefSharp/blob/cefsharp/73/CefSharp.Example/JavascriptBinding/BoundObject.cs#L58を参照してください。

ざっと見てみると、 CefSharpSettings.ConcurrentTaskExecution機能を書き直して、大幅な変更なしでこれをサポートできることに気づきました。

非常に大まかな実装はhttps://github.com/amaitland/CefSharp/commit/a9f20aceb7d78b095d542b96c2f7565424bc8c3cにあります

生産準備が整っているところはありません。

そうです、サポートされていると思い、何か間違ったことをしました。

ただし、 asyncメソッドが呼び出されると、すべてがロックされるのは奇妙なことです。 それが発生したときに警告/例外があるべきではありませんか?

https://github.com/cefsharp/CefSharp/pull/2771にサポートが追加されました。 QUnitのテストケースがいくつかあります。対処する必要のある失敗したケースがある場合は、 PRを送信してください。 。

ChromiumWebBrowserインスタンスを作成する前に、以下を設定する必要があります。 以下を有効にせずにTaskを返そうとすると、詳細なエラーメッセージが表示されます。

この機能は、オブジェクトを非同期として登録する場合にのみ使用できます(例: isAsync: true

`` `c#
CefSharpSettings.ConcurrentTaskExecution = true;

#### Example

```c#
public async Task<string[]> AsyncDownloadFileAndSplitOnNewLines(string url)
{
    var webClient = new WebClient();
    var download = await webClient.DownloadStringTaskAsync(new Uri(url));

    var lines = download.Split('\n').Where(x => !string.IsNullOrEmpty(x.Trim())).ToArray();

    return lines;
}
const url = "https://raw.githubusercontent.com/cefsharp/CefSharp/master/.editorconfig";

boundAsync.asyncDownloadFileAndSplitOnNewLines(url).then(function (lines)
{
    //Do something with the result.
});
このページは役に立ちましたか?
0 / 5 - 0 評価