3

--ac#Windowsランタイムコンポーネント--javascriptアプリケーションで構成されるメトロアプリを作成しました。これはUIを含み、メインアプリケーションです。

c#コンポーネントで、非同期メソッドを作成しました。

async public void createDocument() {
}

しかし、javascriptコードから呼び出そうとすると、.done()またはthen()関数を使用してメソッドcompleted evetを処理できません。これは、エラーがあるためです。javascriptエラー、オブジェクトからdone()を呼び出せません。オブジェクトのインスタンスに設定します。

タスクまたはタスクを関数に割り当てようとすると、別のエラーが発生します。これは、タスクがWindowsランタイムタイプではなく、代わりにIAsyncOperation、IAsyncActionなどを使用することを示しています。

では、c#Windowsランタイムコンポーネントで非同期関数を作成し、done()またはthen()イベントを処理するJavaScriptから呼び出すにはどうすればよいですか?

4

2 に答える 2

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

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 に答える