2012-12-04 68 views
3

我已經創建了一個地鐵應用程序,它由 - 一個C#窗口運行時組件 - 一個JavaScript應用程序,它包含UI並且是主要應用程序。地鐵 - 編寫異步c#操作和從javascript調用

在C#分量I創建異步方法:

async public void createDocument() { 
} 

但是當我嘗試從JavaScript代碼調用它,我不能使用中,.done()或然後()函數處理完成evet的方法,因爲有一個錯誤:javascript錯誤,不能從對象中調用done()而不設置爲對象的一個​​實例。

如果我嘗試將任務或任務分配給函數,我有另一個錯誤,告訴我任務不是Windows運行時類型,而是使用IAsyncOperation,IAsyncAction,ecc ..代替。

那麼,如何在c#windows運行時組件中創建一個異步函數並從JavaScript處理done()或then()事件

回答

2

我發現一篇文章似乎與您遇到的問題有關。我沒有做這個自己,但它的精神說,Javascript的承諾,你不能使用從C#async關鍵字 - 你必須包裝的方法,在稍微不同的方式:代替

public sealed class Class1 
{ 
    public async void testAsync() 
    { 
     // do this asynchronously ... 
    } 
} 

嘗試:

public sealed class Class1 
    { 
     public IAsyncActionWithProgress<Result> testAsync() 
     { 
      return AsyncInfo.Run<Result>((token, result) => 
       Task.Run<Result>(()=> 
        { 
         // do this asynchronously ... 
         return new Result(); 
        } 

       )); 
     } 
    } 

    public sealed class Result { ... } 
    } 

我複製並粘貼示例從本文由羅納德Widha - http://www.ronaldwidha.net/2012/05/10/winrt-consumer-preview-calling-c-csharp-async-class-libraries-from-javascript-winjs-promises-using-then-clause/有人消費者預覽期間寫的,所以它可能已經改變之間當時和最終發行

希望這會幫助你多一點!

+0

謝謝你,它的工作原理! – Marco

1

只是爲了信息,如果您需要調用的程序裏面asyncronous方法,你需要使用:

public static IAsyncOperation<IList<string>> DownloadAsStringsAsync(string id) 
     { 
      return Task.Run<Type retourned>(async() => 
      { 
       var data = await AsyncMethod(...); 
       return (somethingOfTypeRetourned; 
      }).AsAsyncOperation(); 
     }