C# 线程在C。使用计时器、线程和调用shell同时输出所有内容

C# 线程在C。使用计时器、线程和调用shell同时输出所有内容,c#,multithreading,asynchronous,timer,system.timers.timer,C#,Multithreading,Asynchronous,Timer,System.timers.timer,我在阅读大量有关计时器、线程和调用异步进程cmd文件的文档时遇到了一个难题,我想不出哪种方法和哪种组合最适合我的场景 我的设想: 使用.NET Framework 4.6的控制台应用程序 我有一本字典,它的键是一个int,表示一个特定的秒。 进程从第二个0开始 每次我都要调用一个或多个不同的进程,当从开始步骤3开始的秒数与步骤2中字典的键相同时,进程开始。这必须在同一秒钟内,因此我认为所有调用都必须在不同的线程中 这个过程需要一秒钟以上才能完成,我有一个异步调用,它处理一个事件以获取响应。 到目

我在阅读大量有关计时器、线程和调用异步进程cmd文件的文档时遇到了一个难题,我想不出哪种方法和哪种组合最适合我的场景

我的设想:

使用.NET Framework 4.6的控制台应用程序 我有一本字典,它的键是一个int,表示一个特定的秒。 进程从第二个0开始 每次我都要调用一个或多个不同的进程,当从开始步骤3开始的秒数与步骤2中字典的键相同时,进程开始。这必须在同一秒钟内,因此我认为所有调用都必须在不同的线程中 这个过程需要一秒钟以上才能完成,我有一个异步调用,它处理一个事件以获取响应。 到目前为止,我得到的是:

我每秒运行一个System.Thread.Timer,其中有一个示例处理程序,如果该秒有任何值作为键,它将调用一个进程。 但我不知道我必须使用哪种定时器形式、定时器、线程才能以更好的性能/方式来抱怨这一点。我读过这篇文章,但我觉得理解起来有点复杂。这也许是我的第一个问题,一个很好的实现

我还用Ohad Schneider的答案调用了该过程:

但是,对于choosen类型的计时器,我必须使用哪种调用异步/或去同步组合


我在这里有点迷路了,很抱歉我的英语,对这篇文章的任何评论、回答、建议或版本都将被珍视。感谢您的耐心

我将使用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();

你可以按秒对字典进行分类。然后你就知道每次通话前要等多少秒。例如,如果有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
}

但是如果经过的时间是4秒,那么我会跳转3次调用进程。我理解错了?你说你在用秒作为键调用另一个进程。你是说你需要每秒钟调用一个不同的流程吗?我想我现在明白你的想法了,简单、有效,永远不会看起来不一样。多谢了,这只是一个简单的问题——两难是在两个相等的选项之间做出选择,两个选项都可以是好的,也可以是坏的,你不能在它们之间做出选择。这不是问题的同义词。