Metro - 编写异步C#操作并从JavaScript调用

3

我创建了一个由以下内容组成的Metro应用程序: - 一个C# Windows运行时组件 - 一个JavaScript应用程序,其中包含UI并且是主要应用程序。

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

async public void createDocument() {
}

但是当我试图从JavaScript代码中调用它时,我无法使用.done()或.then()函数来处理方法完成事件,因为会出现错误:JavaScript错误,无法从未设置为对象实例的对象调用done()。
如果我尝试将Task或Task分配给该函数,则会出现另一个错误,告诉我Task不是Windows运行时类型,应改用IAsyncOperation、IAsyncAction等。
那么,我该如何在C# Windows运行时组件中创建异步函数,并从JavaScript中调用它以处理done()或then()事件呢
2个回答

2
我可以帮您进行翻译,以下是翻译的内容:

我找到了一篇似乎与您遇到的问题有关的文章。虽然我自己没有尝试过,但大意是说,您不能直接在JavaScript的Promise中使用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 { ... }
    }

我从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/。该文章是在消费者预览版期间编写的,因此在最终发布版本中可能会有所更改。
希望这可以对您有所帮助!

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接