问题描述
我有一个 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);命令完成接下来您的线程可以访问等