0

呼び出された関数は、呼び出し元の関数に、すべての処理が完了したことをどのように知らせますか?

myFunction1(){

    myFunction2();

}

myFunction2(DownloadStringCompletedEventHandler callback){

    // Calls a web service and updates local files

}

myFunction2Returned(object sender, DownloadStringCompletedEventArgs e){


}

次のように呼び出し全体を開始します。

myFunction1();

// Continue processing here...

今私が知りたいのは、私が に電話した場合、処理を続行する前に、すべてが完了するmyFunction1()までどのように待つことができるかということです. myFunction2()(それは、「ここで処理を続行...」コメントの先にあるものです)。

問題は、コードを呼び出した後、 Web サービス呼び出しを完了し、必要なファイルをディスクに完全に書き込んだmyFuntion1()ことに依存するファイルを読み込もうとすることです。myFunction2()

これがすべて意味をなすことを願っていますが、質問を意味のある言葉遣いにするのはかなり困難でした。

4

2 に答える 2

2

async と await を使用する必要があります。次のような関数を書くことができます:

private async void SomeFunction()
{
    // Do something
    await SomeOtherFunction();
    // Do something else
}

あなたの場合のように、これは、他の機能の処理を制御できないWebサービスアクセスなどに特に役立ちます。ここでのキーワードはasync、およびawait関数が非同期プログラミングを伴うことを示すシグナルです。

この構文は比較的新しい (C#5) ですが、質問で .NET の特定のバージョンにタグを付けていないので、最新かつ最高のものを提供すると考えました;)。

于 2012-11-16T12:39:24.113 に答える
1

これには、次のようないくつかのタスク手法を使用する必要があります。

static void SimpleNestedTask()
{
    var parent = Task.Factory.StartNew(() =>
    {
        // myFunction1 code here;
        Console.WriteLine("Outer task executing.");

        var child = Task.Factory.StartNew((t) =>
        {
            // myFunction2 code here
            // Calls a web service and updates local files
            Console.WriteLine("Nested task completing.");
        }, TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning);
   });

    parent.Wait();
    Console.WriteLine("Outer has completed.");
}
于 2012-11-16T12:39:40.700 に答える