使用 WaitHandle 而不是 Thread.Sleep

问题描述

我有一个 C# 控制台应用程序,我在其中循环访问用户列表并创建每个用户并进入另一个数据库

如果用户创建失败 UserId,那么我需要为同一用户重试最多 5 次,每次尝试之间我需要等待 10 秒..

为了这个等待目的,我使用了 System.Threading.Thread.Sleep

foreach(var user in Users)
{
   counter = 0;
   createuserDetails(user.UserId);
   if(!userCreatedSuccesfully)
   {
     do
       {
           counter++;
           System.Threading.Thread.Sleep(10000);
           createuserDetails(user.UserId);
       }
     while(userCreatedSuccesfully == false && counter <5)
   }
}

我想用 Thread.Sleep 替换 WaitHandle。我如何在此处的场景中利用 WaitHandle?请建议是否有其他更好的方法来代替 WaitHandle

注意:我只在此处发布了部分代码,其中仅包含所需内容

解决方法

如果您在这里的目的只是为了避免显式线程阻塞,那么 // Write that dataframe back to the dedicated SQL pool df2.write.synapsesql("yourPool.dbo.someXMLTable_processed",Constants.INTERNAL) 是一个不错的选择。但是,这要求您将调用代码更改为 await Task.Delay(timeout); 确保所有内容都async。如果您有 await 方法,则可以将其更改为 static void Main();同样,对于 static async Task Main(),您可以将其更改为 static int Main() - 请注意,static async Task<int> Main() 需要 C# 7.1 或更高版本。

,

我认为在这种情况下您需要使用lock运算符,因为lock语句获取给定对象的互斥锁,执行语句块,然后释放锁。持有锁时,持有锁的线程可以再次获取和释放锁。任何其他线程都被阻止获取锁并等待锁被释放。

lock (x)
{
    // Your code...
}

当你的 CreateUserDetails(user.UserId);命令完成接下来您的线程可以访问等