Question

I have create a metro app which is composed by - a c# windows runtime component - a javascript application, wich contains the UI and is the main application.

In the c# component I created an async method:

async public void createDocument() {
}

but when I try to call it from the javascript code, I cannot use the .done() or the then() function to handle the method completed evet, because there is an error: javascript error, cannot call done() from object not set to an instance of object.

If I try to assign Task or Task to the function I have another error, which tell me Task is not a windows runtime type and to use IAsyncOperation, IAsyncAction, ecc.. instead.

So, how can I create an async function in the c# windows runtime component and call it from javascript handling the done() or then() events?

Was it helpful?

Solution

I found an article that seems to be related to the problem you are having. I haven't done this myself, but the gist of it says that you can't use the async keyword from C# for Javascript promises - you must wrap the method in a slightly different way:

instead of:

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

try:

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

I copied and pasted the examples from this article by 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/ It was written during the consumer preview, so it might have changed between then and the final release

Hopefully that will help you a bit more!

OTHER TIPS

Just for information, if you need to call asyncronous methods inside the procedure, you need to use:

public static IAsyncOperation<IList<string>> DownloadAsStringsAsync(string id)
        {
            return Task.Run<Type retourned>(async () =>
            {
                var data = await AsyncMethod(...);
                return (somethingOfTypeRetourned;
            }).AsAsyncOperation();
        }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top