3

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

在 c# 组件中,我创建了一个异步方法:

async public void createDocument() {
}

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

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

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

4

2 回答 2

2

我发现一篇文章似乎与您遇到的问题有关。我自己没有这样做,但它的要点是你不能将 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/它是在消费者预览期间编写的,因此它可能在那时和最终版本之间发生了变化

希望这会对您有所帮助!

于 2012-12-04T22:36:32.727 回答
1

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

public static IAsyncOperation<IList<string>> DownloadAsStringsAsync(string id)
        {
            return Task.Run<Type retourned>(async () =>
            {
                var data = await AsyncMethod(...);
                return (somethingOfTypeRetourned;
            }).AsAsyncOperation();
        }
于 2012-12-05T09:59:44.653 回答