2016-11-02 13 views
2

CefSharpでJSから.NET非同期メソッドを呼び出す方法を教えてください。 私はコンソールアプリケーションコールを待つメソッドを呼びたいと思います。CefSharpのJSから非同期メソッドを呼び出す

私の考えは以下の通りである。 私は以下のシグネチャを持つメソッドを呼び出します。

public async Task<int> Calculate(){ 

、その結果はJS側の約束によってバック与えられ、その後、終了していますとき。 現在、動作しません。終了したらコールバックがなくなり、再び呼び出すことができなくなります。

ありがとうございました

答えて

2

私は同じ問題に立ちました。

醜い回避策はasync voidにあなたの方法をマングリングと2つのIJavascriptCallback引数(resolverejectを)受け入れているように見えます。例えば

として登録
public class MyCalculator 
{ 
    public async void CalcAsync(
     string name, 
     IJavascriptCallback resolve, 
     IJavascriptCallback reject) 
    { 
     try 
     { 
      if (resolve.IsDisposed) 
       return; 

      int i = /* compute i */; 

      if (!resolve.IsDisposed) 
       await resolve.ExecuteAsync(i); 
     } 
     catch (Exception e) 
     { 
      if (!reject.IsDisposed) 
       await reject.ExecuteAsync(e.ToString()); 
     } 
    } 
} 

browser.RegisterAsyncJsObject("myCalculator", new MyCalculator()); 

次に、あなたのJavaScriptで:

function doThingAsync(name) { 
    return new Promise(function (resolve, reject) { 
     window.myCalculator.calcAsync(name, resolve, reject); 
    }); 
} 

var result = await doThingAsync("foo") 

次のようなものとしてパターンを引き出すことができます の

private static async Task Promisify(IJavascriptCallback resolve, IJavascriptCallback reject, Func<Task> action) 
{ 
    try 
    { 
     if (!resolve.IsDisposed) 
      await action(); 

     if (!resolve.IsDisposed) 
      await resolve.ExecuteAsync(); 
    } 
    catch (Exception e) 
    { 
     if (!reject.IsDisposed) 
      await reject.ExecuteAsync(e.ToString()); 
    } 
} 

private static async Task Promisify<T>(IJavascriptCallback resolve, IJavascriptCallback reject, Func<Task<T>> action) 
{ 
    try 
    { 
     var result = default(T); 

     if (!resolve.IsDisposed) 
      result = await action(); 

     if (!resolve.IsDisposed) 
      await resolve.ExecuteAsync(result); 
    } 
    catch (Exception e) 
    { 
     if (!reject.IsDisposed) 
      await reject.ExecuteAsync(e.ToString()); 
    } 
} 

バインドされたオブジェクトのメソッドは、似ているでしょう:

public class MyCalculator 
{ 
    public async void CalcAsync(
     string name, 
     IJavascriptCallback resolve, 
     IJavascriptCallback reject) 
    { 
     Promisify(resolve, reject,() => /* compute i */); 
    } 
} 

を私が使用したい(架空の)APIが似ているでしょう:

public class MyCalculator 
{ 
    public async Task<int> CalcAsync(string name) => /* compute i */; 
} 

そして:

var result = await window.myCalculator.calcAsync("foo") 
関連する問題