c# - 使用 Thread.Sleep() 总是不好的吗?

标签 c# multithreading sleep

我为 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/

相关文章:

c# - Windows 窗体 : Pass clicks through a partially transparent always-on-top window

java - Thread类和Object类中的方法

c++ - pthreads 中的条件变量和释放多个锁

c# - Thread.Sleep(TimeSpan) 有多准确?

sleep - 如何在 8051 微 Controller 上等待一秒钟?

c# - 在 Universal Apps 中捕获当前网站的屏幕截图

c# - 将硬编码的 JSON 字符串存储到变量

c# - 为什么这是在静态上下文中?

ios - NSObjectInaccessibleException',原因 : 'CoreData could not fulfill a fault

C - 创建两个可以生成奇数和偶数的进程