2016-11-02 3 views
2

CefSharp의 JS에서 .NET 비동기 메서드를 호출하려면 어떻게해야합니까? 콘솔 응용 프로그램 호출을 기다리는 메서드를 호출하고 싶습니다. 나는 아래의 서명 메소드를 호출 :CefSharp의 JS에서 async 메서드 호출

public async Task<int> Calculate(){ 

그리고 그것은 다음 완료 때 그 결과가 JS 측의 약속에 의해 다시 주어진

내 생각은 다음이다. 현재 작동하지 않습니다. 끝나면 콜백이 없으며 다시 호출 할 수 없습니다.

고맙습니다.

답변

2

동일한 문제가 발생했습니다.

못생긴 해결 방법은 두 IJavascriptCallback 인수 (resolvereject)를 async void에 방법을 엉망으로하고 받아들이는 것 같다. 예를 들어

: 자바 스크립트에서 다음

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

:

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

var result = await doThingAsync("foo") 

당신이 좋아하는 무언가로 밖으로 패턴을 뽑을 수 :

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()); 
     } 
    } 
} 

는 등록

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")