C#中的监听器和控制流程

时间:2012-11-16 12:27:22

标签: c# asynchronous listener

被调用函数如何让调用函数知道他已完成所有处理?

myFunction1(){

    myFunction2();

}

myFunction2(DownloadStringCompletedEventHandler callback){

    // Calls a web service and updates local files

}

myFunction2Returned(object sender, DownloadStringCompletedEventArgs e){


}

像这样开始整个通话:

myFunction1();

// Continue processing here...

现在我想知道的是,如果我致电myFunction1(),你怎么能等到myFunction2()中的所有内容都已完成,然后再继续进行处理? (这就是'继续处理......'评论之外的任何谎言。)

问题是,在我调用myFuntion1()之后,我尝试读取依赖myFunction2()完成它的Web服务调用并完全将所需文件写入磁盘的文件。{/ p >

我希望这一切都有道理,很难让问题的措辞正确。

2 个答案:

答案 0 :(得分:2)

您需要使用async和await。你可以写一个这样的函数:

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

与您的情况一样,这对于Web服务访问等特别有用,您无法控制其他功能的处理。这里的关键字是asyncawait,表示该函数将涉及异步编程。

请注意,这种语法相对较新(C#5),但由于你没有在你的问题中标记任何特定版本的.NET,我想我会给你最新最好的。)。

答案 1 :(得分:1)

您应该使用一些任务技术,something like this

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.");
}