【问题标题】:Metro - write async c# operation and call from javascriptMetro - 编写异步 c# 操作并从 javascript 调用
【发布时间】:2012-12-04 22:06:11
【问题描述】:

我创建了一个 Metro 应用程序,该应用程序由 - 一个 c# windows 运行时组件 - 一个 javascript 应用程序,它包含 UI 并且是主应用程序。

在 c# 组件中我创建了一个 async 方法:

async public void createDocument() {
}

但是当我尝试从 javascript 代码中调用它时,我无法使用 .done() 或 then() 函数来处理方法 completed evet,因为出现错误:javascript error, cannot call done()从未设置的对象到对象的实例。

如果我尝试将 Task 或 Task 分配给函数,我会遇到另一个错误,这告诉我 Task 不是 Windows 运行时类型,而是使用 IAsyncOperation、IAsyncAction、ecc..。

那么,如何在 c# windows 运行时组件中创建异步函数并从处理 done() 或 then() 事件的 javascript 中调用它

【问题讨论】:

    标签: c# javascript asynchronous microsoft-metro runtime-type


    【解决方案1】:

    我发现一篇文章似乎与您遇到的问题有关。我自己没有这样做,但它的要点是你不能将 C# 中的 async 关键字用于 Javascript 承诺 - 你必须以稍微不同的方式包装该方法:

    代替:

    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 { ... }
        }
    

    我复制并粘贴了 Ronald Widha 的这篇文章中的示例 - http://www.ronaldwidha.net/2012/05/10/winrt-consumer-preview-calling-c-csharp-async-class-libraries-from-javascript-winjs-promises-using-then-clause/ 它是在消费者预览版期间编写的,因此它可能在那时和最终版本之间发生了变化

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      仅供参考,如果需要在过程内部调用异步方法,则需要使用:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多