【问题标题】:Using Task.Factory.StartNew with Thread.Sleep to wait x seconds使用 Task.Factory.StartNew 和 Thread.Sleep 等待 x 秒
【发布时间】:2013-10-24 08:17:03
【问题描述】:

我可以做这样的事情来等待,例如 5 秒,然后继续使用其他方法并且不冻结我的 UI 吗?

System.Threading.Tasks.Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);
    // Code to do some method
});

【问题讨论】:

  • “等待而不冻结”是什么意思?
  • 我不想使用 Thread.Sleep,因为它会冻结我的 UI
  • 它是如何冻结你的用户界面的? UI 被冻结到底是什么意思?

标签: c# multithreading task-parallel-library


【解决方案1】:

你应该使用:

await Task.Delay(5000);

【讨论】:

  • 事实上,IIRC,这是延迟正在运行的任务的推荐方式。
  • 唯一的区别是Task.Delay()之后的代码是在当前dispatcher而不是Factory.StartNewThreadPool线程上执行的。
  • 如果 OP 不针对 .NET 4.5?
  • @MatthewWatson 我不知道这里有这样的约定。
  • @OndrejJanacek 我的意思是人们倾向于假设您使用的是最新的东西,除非另有说明 - 否则每个答案都必须为多年前的 .Net 版本提供解决方案。例如,人们倾向于提供需要使用 Linq 的答案,即使 .Net 2 中不存在这种情况。
【解决方案2】:

Thread.Sleep() 不推荐。将线程/任务阻塞 5 秒是没有好处的。

正如@Jeroen van Langen's answer 中提到的,await Task.Delay() 是最好的方法。但是,如果由于某种原因您无法使用async/await 机制,则第二好的选择是设置一次性 5 秒计时器。 Windows.Forms.Timer 用于 WinForms 或 DispatcherTimer 用于 WPF。

Task.Delay() 又由计时器实现。)

【讨论】:

  • 使用 Task.Delay(5000).ContinueWith(x => MyMethod()) 怎么样? Task.Delay() 之前的 await 是什么意思?
  • 当然可以,但请注意,默认情况下,您的委托不会在 UI 线程上运行。您必须将 SynchronizationContextScheduler 传递给 ContinueWith 方法。见stackoverflow.com/a/4331287/1529246
  • 要了解await,请使用您最喜欢的搜索引擎并搜索c# 5.0 async await。它是 C# 5.0 的新特性——它是非阻塞的。 await 还自动捕获当前同步上下文。
  • 这不能编译:Task UITask = Task.Delay(5000).ContinueWith(() => { myMethod(); }, TaskScheduler.FromCurrentSynchronizationContext());委托 'System.Action' 不采用 0 参数
  • 把它改成这个...ContinueWith( _ => { myMethod(); } ...,其中_代表Task.Delay()的已完成任务。您通常不会使用该变量,因此约定将其命名为 _
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多