【问题标题】:Creating a thread inside a task在任务中创建线程
【发布时间】:2012-06-15 06:30:40
【问题描述】:

我有一个方法 UploadReportNotifier() 订阅了一个事件,一旦我完成将数据上传到数据库就会引发该事件。在 UploadReportNotifier() 中,我想重置我的 GUI 上的一些值,即进度条等,但我希望在执行此操作之间有一个时间延迟。

是否可以在UploadReportNotifier()内部创建一个线程并调用thread.Sleep,还是timer()类更合适?

感谢您的帮助。

【问题讨论】:

    标签: winforms multithreading c#-4.0 timer task


    【解决方案1】:

    如果您的目标是在执行 UploadReportNotifier 之后等待一段时间再更新所有 GUI 控件,那么 IMO 将是一个很好的解决方案。

    在您的UploadReportNotifier 方法中,您可以创建并启动一个计时器,以便您的“更新我的GUI”代码将在一段时间后执行。不要忘记在 GUI 更新后停止/处置计时器,因为您可能不希望它被多次执行。

    您可以使用System.Windows.Forms.Timer 计时器类(您可能知道,有多个计时器类可用)。 这个不是最准确的,但是它在UI线程中执行代码,所以你在修改UI时不会处理跨线程异常。

    【讨论】:

    • 非常感谢肯,非常感谢!
    【解决方案2】:

    我看到您已经找到了解决方案。我只想提一下,在这种情况下,您应该始终选择计时器而不是 Thread + Sleep,这只是一个丑陋的 hack,应该始终避免。

    计时器很棒,因为它们也能够在 GUI 线程上执行它们的代码,因此您不需要使用 InvokeBeginInvoke。例如 System.Windows.Forms.Timer 用于 WinForms 或 System.Windows.Threading.DispatcherTimer 用于 WPF。

    【讨论】:

    • 我以为我有,但它的布局方式不起作用所以我错了。
    • 看起来你和 Ken2K 都在建议计时器,所以我会选择那个选项。感谢您的帮助。
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多