我为 Random
类创建了一个扩展方法,它随机执行一个 Action
(void delegate):
public static class RandomExtension
{
private static bool _isAlive;
private static Task _executer;
public static void ExecuteRandomAsync(this Random random, int min, int max, int minDuration, Action action)
{
Task outerTask = Task.Factory.StartNew(() =>
{
_isAlive = true;
_executer = Task.Factory.StartNew(() => { ExecuteRandom(min, max, action); });
Thread.Sleep(minDuration);
StopExecuter();
});
}
private static void StopExecuter()
{
_isAlive = false;
_executer.Wait();
_executer.Dispose();
_executer = null;
}
private static void ExecuteRandom(int min, int max, Action action)
{
Random random = new Random();
while (_isAlive)
{
Thread.Sleep(random.Next(min, max));
action();
}
}
}
它工作正常。
但是在这个例子中使用 Thread.Sleep()
可以吗,或者您通常不应该使用 Thread.Sleep()
,会出现什么并发症?有其他选择吗?
最佳答案
使用 Thread.Sleep
不好吗?通常不会,如果你真的想暂停线程。但在这种情况下,您不想挂起线程,而是想挂起任务。
所以在这种情况下,你应该使用:
await Task.Delay(minDuration);
这不会挂起整个线程,而只会挂起您要挂起的单个任务。同一线程上的所有其他任务可以继续运行。
关于c# - 使用 Thread.Sleep() 总是不好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873098/