-4

我在阅读大量有关计时器、线程和调用异步进程(cmd 文件)的文档时陷入两难境地,无法确定哪种方法和哪种组合最适合我的方案..

我的场景:

  1. 带有 .NET Framework 4.6 的控制台应用程序
  2. 我有一个字典,它有一个(作为键)一个 int 来预测特定秒的值。
  3. 该过程从第二个零 (0) 开始
  4. 当从开始(步骤 3)经过的秒数与字典的键(在步骤 2 中)相同时,我必须调用一个(或多个)进程(每次都不同,进程启动)。这必须在同一秒内,所以所有调用都必须在不同的线程中(我假设)
  5. 这个过程需要一秒钟多的时间才能完成,我有一个异步调用来处理一个事件以获取响应。

到目前为止我得到了什么:

我每秒都在运行一个 System.Thread.Timer,它带有一个示例处理程序,如果该秒有任何值作为键,则该处理程序调用一个进程。
但是我不知道必须使用哪个计时器(Form,Timer,Thread)才能以更好的性能/方式抱怨这一点。我读过这个,但我认为理解它有点复杂。这也许是我的第一个问题,一个很好的实现。

我也用 Ohad Schneider 的回答调用了这个过程: 是否有任何异步等效的 Process.Start?

但同样,我必须使用选择的计时器类型来调用异步/异步的哪个组合?

我在这里有点迷路,对不起我的英语,对这篇文章的任何评论、回答、建议或版本都将受到重视。谢谢你的耐心

4

2 回答 2

2

您可以按秒对字典进行排序。然后您就知道每次通话前要等待多少秒。例如,如果您有 5、9、10 和 22 的条目,则在开始第一个进程之前等待 5 秒。之后,您等待 4 秒钟再拨打下一个电话,依此类推。

这会导致一些非常简单的代码不会进行不必要的轮询:

// this starts at second 00
foreach (var second in dict.OrderBy(d => d.Key))
{
    var secondsToWait = second.Key - DateTime.Now.Seconds;
    if (secondsToWait > 0)
    {
        await Task.Delay(secondsToWait * 1000);
    }
    // start your process here
}
于 2017-09-12T21:40:58.790 回答
2

我会使用 System.Diagnostics.Stopwatch 作为你的计时器。您可以启动它,拉出经过的秒数,然后检查它是否正在运行。

像:

var s = new System.Diagnostics.Stopwatch();
s.Start();

while(true)
{
    await Task.Delay(500);
    var secondsElapsed = s.ElapsedMilliseconds / 1000;
    await Task.Run(() => Process.Start(processes[secondsElapsed]));
 }

 s.Stop();
于 2017-09-12T20:18:17.533 回答