【问题标题】:Task status when task has a timer elapsed event任务具有计时器已用事件时的任务状态
【发布时间】:2013-04-08 12:37:55
【问题描述】:

我正在使用 TPL 创建并行任务。每个任务都有计时器经过事件,因此每 2 秒它调用另一个方法。这将持续很长时间。但是,当调用定时器事件时的状态是“RanToCompletion”。当任务每隔几秒钟调用一次事件计时器时,任务怎么会是这种状态?示例代码如下。

Task<int>[] tasks = new Task<int>[n];
for (int i = 0; i < 20; i++)
{
    tasks[i] = Task<int>.Factory.StartNew(() =>
    {
        Work work = new Work();
        work.doWork();
        return 1;
    }
    );
}

public void doWork()
{
        System.Timers.Timer aTimer = new System.Timers.Timer(1000);
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Start()
};

【问题讨论】:

    标签: c# .net task-parallel-library


    【解决方案1】:

    每个任务主体只创建一个计时器,因此当您点击返回时任务完成。计时器不会阻止任务。

    任务完成有问题吗?如果是这样,您能否详细说明原因?

    FWIW,Task 通常非常适合单个未来值。如果您希望每 X 秒发生一次,要么直接创建/使用计时器(不需要任务),要么考虑使用 Observable.Interval 之类的东西每 X 秒获取一个持续的值流。

    【讨论】:

    • 感谢您的解释。但我有一个疑问。在这种特殊情况下,任务将创建一个线程,该线程将创建一个计时器。那么在任务完成之后线程会终止吗?
    • 当计时器被创建时,它是否会产生一个独立的线程来继续调用事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2021-03-18
    • 2020-01-29
    • 2012-06-27
    • 2016-07-20
    相关资源
    最近更新 更多