C# 中的线程。使用计时器、线程并同时调用 shell 输出所有内容
Threading in C# . Using timer, threads and calling shell with output everything at the same time
我在阅读大量关于定时器、线程和调用异步进程(cmd 文件)的文档时感到进退两难,无法确定哪种方法和哪种组合最适合我的场景..
我的场景:
- 带有 .NET Framework 4.6 的控制台应用程序
- 我有一个字典,它有一个预示特定秒的整数(作为键)。
- 进程从第二个零 (0) 开始
- 当从开始(第 3 步)开始经过的秒数与字典的键(在第 2 步中)相同时,我必须调用一个(或多个)进程(每次都不同,随着进程开始)。这必须在同一秒内进行,因此所有调用都必须在不同的线程中(我假设)
- 此过程需要一秒以上的时间才能完成,我有一个处理事件的异步调用以获取响应。
到目前为止我得到了什么:
我每秒 运行 System.Thread.Timer 一个示例处理程序,如果那一秒有任何值作为键,该处理程序将调用一个进程。
但我想不出我必须使用哪个计时器(表单、计时器、线程)才能以更好的性能/方式抱怨这一点。我读到了这个,但我认为理解它有点复杂。这也许是我的第一个问题,一个很好的实现。
我还用 Ohad Schneider 的回答调用了这个过程:
Is there any async equivalent of Process.Start?
但同样,我必须将调用异步/或非同步的哪种组合与所选类型的计时器一起使用?
我在这里有点迷路,抱歉我的英语不好,对此 post 的任何评论、回答或建议或版本都将被预估。感谢您的耐心等待
我会用 System.Diagnostics.Stopwatch 作为你的计时器。您可以启动它,拉出 Elapsed 秒数,然后检查它当前是否为 运行.
类似的东西:
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
}
我在阅读大量关于定时器、线程和调用异步进程(cmd 文件)的文档时感到进退两难,无法确定哪种方法和哪种组合最适合我的场景..
我的场景:
- 带有 .NET Framework 4.6 的控制台应用程序
- 我有一个字典,它有一个预示特定秒的整数(作为键)。
- 进程从第二个零 (0) 开始
- 当从开始(第 3 步)开始经过的秒数与字典的键(在第 2 步中)相同时,我必须调用一个(或多个)进程(每次都不同,随着进程开始)。这必须在同一秒内进行,因此所有调用都必须在不同的线程中(我假设)
- 此过程需要一秒以上的时间才能完成,我有一个处理事件的异步调用以获取响应。
到目前为止我得到了什么:
我每秒 运行 System.Thread.Timer 一个示例处理程序,如果那一秒有任何值作为键,该处理程序将调用一个进程。
但我想不出我必须使用哪个计时器(表单、计时器、线程)才能以更好的性能/方式抱怨这一点。我读到了这个,但我认为理解它有点复杂。这也许是我的第一个问题,一个很好的实现。
我还用 Ohad Schneider 的回答调用了这个过程: Is there any async equivalent of Process.Start?
但同样,我必须将调用异步/或非同步的哪种组合与所选类型的计时器一起使用?
我在这里有点迷路,抱歉我的英语不好,对此 post 的任何评论、回答或建议或版本都将被预估。感谢您的耐心等待
我会用 System.Diagnostics.Stopwatch 作为你的计时器。您可以启动它,拉出 Elapsed 秒数,然后检查它当前是否为 运行.
类似的东西:
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
}