2012-11-16 33 views
0

被调用函数如何让调用函数知道他已完成所有处理?C中的监听器和控制流#

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服务调用并将所需文件完全写入磁盘。

我希望这一切都合情合理,让这个问题的措词正确无误是非常困难的。

+0

我很困惑。它不是已经为你工作吗? –

+0

@J。斯蒂恩 - 看看我编辑的问题。有点更详细。 – Tiwaz89

+0

如果两个函数在同一个线程上运行,它应该等待 – trydis

回答

2

您需要使用异步并等待。您可以编写一个函数是这样的:

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

由于是在你的情况下,如果你没有在其他功能的处理控制,这是对于像Web服务访问尤其有用。这里的关键字是asyncawait,这表示函数将涉及异步编程。请注意,这个语法是相对较新的(C#5),但由于您没有在您的问题中标记任何特定版本的.NET,我想我会给你最新的和最好的;)。

+0

'async'和'await'只是糖,你应该知道它们到底发生了什么。 – VMAtm

+0

当然你应该。 –

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