如何在C#中运行main函数一段时间后调用一个函数

时间:2015-03-02 15:08:33

标签: c# timer async-await

我在main函数中有一些代码,我希望在一个随机时间(例如100 ms)之后通过调用foo之类的另一个函数来中断main函数。我该怎么做? 例如见下文:

void main()
{
    intsruction 1;
    intsruction 2;
    intsruction 3;// for example if 100 ms ends after executing instruction 
                  //3 the foo function should call after it, and after executing
                  //foo function, returns here and execute instruction 4
    intsruction 4;
    intsruction 5;
    intsruction 6;
}

foo函数:

void foo()
{
    instruction 7;
}

完成执行后,程序流程可以是:

 intsruction 1;
 intsruction 2;
 intsruction 3;
 intsruction 7;// foo
 intsruction 4;
 intsruction 5;
 intsruction 6;

2 个答案:

答案 0 :(得分:1)

您不能在某个时刻“中断”main,并在100ms后运行您的代码。相反,您可以做的是在100ms后运行您感兴趣的代码(例如,使用System.Timers.Timer)。 之后,如果暂停主线程的原因是某些点之间的依赖关系,那么在点检查两个结果: main timers 并做出适当的选择。这称为推测执行,您可以在其中运行假设的if分支的两种情况,并在选择适当的结果后运行。注意:该技术通常用于并行计算。

答案 1 :(得分:0)

或者更好的是,您可以使用Reactive Extensions并停止担心中断。使用Rx,您可以根据您的要求设置完全解耦的定时数据推送,将通知的客户端(您的程序)仅设置对Observable的订阅。您的代码看起来与此类似:

 TheDataDesired.Subscribe(p=>{
      //the variable p now has the data.
 });

它类似于事件处理,但在某些方面更好,因为数据已经编组到订户的线程上。除此之外,对LINQ的广泛支持,你有一个非常好的解耦方式来获取数据,只需等待它到达。现在它不仅仅是数据,它可以是包括系统上事件处理在内的任何事物。

我们的好朋友Lee Campbell慷慨地提供了一个关于入门的非常好的教程:http://www.introtorx.com/content/v1.0.10621.0/01_WhyRx.html

比订阅你想要的东西和开展业务更容易吗?