在不阻止UI的情况下运行任务两秒钟

时间:2017-06-22 10:35:16

标签: .net vb.net multithreading semaphore

我正在编写一个与CAN总线交互的VB.Net应用程序,以便控制其上的某些电机。 通过CAN总线,我可以在正常和反向模式下打开和关闭每个电机,并读取它们的电流消耗。 我为每个电机实现了两个复选框,使其正常或反向运行,以及一个显示实际电流消耗的文本框,这实际上是有效的。 现在我想要做的是自动化一些测试,例如:

  • 在每个方向上运行每个电机两秒钟并记录它的消耗量以查看值是否正确。

为此,我创建了一个TestMotor类,我发送了两个按钮的参考,这两个按钮在正常或反向每个电机时打开。每个测试类代表每个电机的测试,所以如果我有4个电机,我将创建4个TestMotor对象,给它们两个复选框,为该电机供电。

最后,TestMotor类有一个executeTest,它主要通过选中和取消选中复选框,在每个方向上两秒钟内运行电机。 这两秒就会延迟它们之间的延迟。

我的问题是,如果我直接在主线程上运行这些测试,Thread.sleep会阻止UI线程,但是如果我创建一个线程然后执行那些测试,那些测试就会同时执行。

你会如何解决这个问题?我一直在尝试使用异步任务,计时器,现在我将尝试一些信号量或其他东西,但对解决这个问题的最佳方法有一点帮助就很棒。

一些代码:

在主要班级

for each test in test
    test.executeTest()
end for

TestMotor类

public sub executeTest()
    ckNormal.checked = true
    Thread.sleep(2000)
    ckNormal.checked = false
    ckReverse.checked = true
    Thread.sleep(2000)
    ckReverse.checked = false
end sub

谢谢!

2 个答案:

答案 0 :(得分:0)

请勿使用Thread.sleep()使用Task.Delay()

来自@StephenCleary THIS THREAD的回复。

  

如果要阻止当前线程,请使用Thread.Sleep

     

如果您想要一个逻辑延迟而不阻止,请使用Task.Delay   当前主题。

答案 1 :(得分:0)

是的,我也尝试过,但如果我使用async tasc执行Task.Delay,则问题是同时尝试正常和反向模式。最后我做到了这一点:

Private Sub autocheck_btStart_Click(sender As Object, e As EventArgs) Handles autocheck_btStart.Click
    If Not currentlyTesting Then
        currentlyTesting = True
        principal.setRecording(True, ecu)
        Dim t As Task = Task.Run(Sub()
                                     startTesting()
                                 End Sub)
        principal.setRecording(False, ecu)
        currentlyTesting = False
    End If
End Sub

Public Sub startTesting()
    For Each test In tests
        tbDebug.AppendText("Testing motor " + test.getName() + Environment.NewLine)
        test.executeTest()
    Next
    showResults()
End Sub

Public Sub executeTest()
    isTesting = True
    ckNormal.Checked = True
    Thread.Sleep(2000)
    ckNormal.Checked = False
    Thread.Sleep(200)
    ckReverse.Checked = True
    Thread.Sleep(2000)
    ckReverse.Checked = False
    Thread.Sleep(200)
    isTesting = False
End Sub

感谢您的建议!!