取消异步任务的替代方法
Alternate ways to cancel async task
我正在尝试找到执行此操作的最佳方法,到目前为止,我的 none 尝试都奏效了。寻找一些额外的输入。
我有一个sub需要在后台执行,是这样的
Sub Start_Work()
'Step 1
Sleep(1000)
'Step 2
Sleep(2000)
'Step3
Sleep(1000)
'Step 4
End Sub
我是这么叫的
Dim Task1 As Task
Task1 = Task.Factory.StartNew(Sub() Start_Test())
我看到的所有取消任务的例子都使用for循环来不断检查Cancellation Token,但在这种情况下有点难做。
我正在考虑添加一个 while 循环和状态,但我不确定如何让代码在进入下一步之前等待一两秒钟。
任何 comments/suggestions 欢迎。
你可以使用 manualresetevent 来处理它
manualresetevent 将允许您立即停止它,而不是等待完整的睡眠时间
在此示例中,您将永远达不到 Console.WriteLine("start wait 3")
Imports System.Threading
Imports System.Threading.Tasks
Module Module1
Dim mreWait As New ManualResetEvent(False)
Dim stopTask As Boolean
Sub Main()
Dim task1 As task
task1 = Task.Factory.StartNew(Sub() start_work())
Console.WriteLine("waiting")
Thread.Sleep(1500)
Console.WriteLine("stop")
stopTask = True
mreWait.Set()
Console.Read()
End Sub
Sub start_work()
mreWait.Reset()
Console.WriteLine("start wait 1")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("start wait 2")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("start wait 3")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("stop start_work")
End Sub
End Module
我正在尝试找到执行此操作的最佳方法,到目前为止,我的 none 尝试都奏效了。寻找一些额外的输入。
我有一个sub需要在后台执行,是这样的
Sub Start_Work()
'Step 1
Sleep(1000)
'Step 2
Sleep(2000)
'Step3
Sleep(1000)
'Step 4
End Sub
我是这么叫的
Dim Task1 As Task
Task1 = Task.Factory.StartNew(Sub() Start_Test())
我看到的所有取消任务的例子都使用for循环来不断检查Cancellation Token,但在这种情况下有点难做。
我正在考虑添加一个 while 循环和状态,但我不确定如何让代码在进入下一步之前等待一两秒钟。
任何 comments/suggestions 欢迎。
你可以使用 manualresetevent 来处理它
manualresetevent 将允许您立即停止它,而不是等待完整的睡眠时间
在此示例中,您将永远达不到 Console.WriteLine("start wait 3")
Imports System.Threading
Imports System.Threading.Tasks
Module Module1
Dim mreWait As New ManualResetEvent(False)
Dim stopTask As Boolean
Sub Main()
Dim task1 As task
task1 = Task.Factory.StartNew(Sub() start_work())
Console.WriteLine("waiting")
Thread.Sleep(1500)
Console.WriteLine("stop")
stopTask = True
mreWait.Set()
Console.Read()
End Sub
Sub start_work()
mreWait.Reset()
Console.WriteLine("start wait 1")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("start wait 2")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("start wait 3")
mreWait.WaitOne(1000)
If stopTask Then Return
Console.WriteLine("stop start_work")
End Sub
End Module