什么时候使用Task.Delay和Thread.Sleep有很好的规则?
我经常看到它提到Thread.Sleep();不应该使用,但我不明白为什么会这样.如果Thread.Sleep();可能造成麻烦,是否有任何替代解决方案具有相同的安全性?
例如.
while(true)
{
doSomework();
i++;
Thread.Sleep(5000);
}
Run Code Online (Sandbox Code Playgroud)
另一个是:
while (true)
{
string[] images = Directory.GetFiles(@"C:\Dir", "*.png");
foreach (string image in images)
{
this.Invoke(() => this.Enabled = true);
pictureBox1.Image = new Bitmap(image);
Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud) .NET 4.5中 有Task.Delay
我怎么能在.NET 4.0中做同样的事情?
.net c# parallel-processing multithreading task-parallel-library
是否有一个简单的解决方案/想法/策略来在WinForms应用程序中创建一个setTimeout等效函数.我主要是一个Web开发人员,但我不确定如何在WinForms应用程序中进行此操作.基本上,我有一个文本框,每次击键后我想运行一个任务来填充一个列表(比如一个自动完成类型的东西),但是如果用户继续输入字符,希望能够取消(例如clearTimeout)...
我唯一的猜测是可能使用BackGroundWorker并使其初始睡眠,当它处于休眠状态时,它可以被取消,如果用户停止输入键并且睡眠期结束,则它会运行任务等
(我不在乎一个例子是C#还是Vb.Net)
我有一个ASP.Net MVC 4应用程序,它定期调用外部API来获取信息(资源).此资源具有帐户的速率限制器(意味着其他应用程序使用相同的池并可能达到限制).当达到此限制时,它将以秒为单位发回一个标题为"Retry-After"的HTTP状态代码429(比方说25秒).
如果我的应用程序得到此响应,我将需要延迟执行25秒并重试.首先,让我说这个代码运行的方法是一个ASP.Net 4.5异步方法.为此,我正在考虑使用System.Threading.Thread.Sleep(25000)Now,我真的不喜欢使用它,有没有更好的方法呢?
我不得不说我为这个开放式问题道歉,但我找不到任何正确的延迟执行方式(同时保持异步并确保我们不会耗尽线程)
更新: 以下代码是否会更好地延迟?
await Task.Run(() => Thread.Sleep(10000))
Run Code Online (Sandbox Code Playgroud) 我想要清楚一点.我知道Task.Delay内部会使用一个Timer,它显然是基于任务的(等待),但Thread.Sleep会导致线程被阻塞.但是,在任务上调用.Wait会导致线程被阻塞吗?
如果没有,人们会认为这Task.Delay(2500).Wait()比好Thread.Sleep(2500).这跟我所说的SO问题/答案略有不同.Wait().
我想用线程取消阻止ui.
你能告诉我这段代码有什么区别:
private async void button1_Click(object sender, EventArgs e)
{
int result = await Calculate(1, 2);
label1.Text = result.ToString();
}
private async Task<int> Calculate(int number1, int number2)
{
return await Task.Run(() =>
{
Thread.Sleep(5000);
return number1 + number2;
});
}
Run Code Online (Sandbox Code Playgroud)
这段代码:
private async void button1_Click(object sender, EventArgs e)
{
int result = await Calculate(1, 2);
label1.Text = result.ToString();
}
private async Task<int> Calculate(int number1, int number2)
{
await Task.Delay(5000);
return number1 + number2;
}
Run Code Online (Sandbox Code Playgroud) 在使用asyncand时await,有时我会遇到一个让我讨厌使用它的地方,因为我觉得它毫无意义。我还没有成功证明情况也是如此(而且,诚然,保留它不会损害性能)。我如何在以下示例中验证(或拒绝)我的主张。
bool empty = await Context.Stuff.AnyAsync();
if(empty)
throw new Exception();
Run Code Online (Sandbox Code Playgroud)
我的主张是 - 由于我们立即使用检查结果来验证是否应该离开该方法,因此该调用需要同步启动。因此,我相信以下内容没有更差的表现。
bool empty = Context.Stuff.Any();
if(empty)
throw new Exception();
Run Code Online (Sandbox Code Playgroud)
我如何验证我的主张(除了经验之外)?
我想知道 Task.delay Task.Wait 和 Thread.sleep 之间的区别
当我们使用thread.sleep时。从睡眠中唤醒后,将创建一个新堆栈。请让我告诉我它们之间真正的区别是什么。
c# ×7
.net ×3
async-await ×3
.net-6.0 ×1
asp.net-4.5 ×1
c#-4.0 ×1
javascript ×1
settimeout ×1
sleep ×1
task ×1
winforms ×1