task小问题

橘子皮... 2017-12-26 08:34:33

Dim t As Task = New Task(Function() TaskGo(5))
t.Start()
t.wait()
msgbox ("ok")
/////////////

Private Function TaskGo(ByVal tasknum As Integer)
Dim tasks(tasknum) As Task

For i = 0 To tasknum - 1
Dim ti As Integer = i
tasks(i) = Task.Factory.StartNew(Function() TaskGoGo(ti), Cts)
Next
Task.WaitAll(tasks, Cts.Token)
Return Nothing
End Function

Private Function TaskGoGo(ByVal ti As Integer)
...
End Function


请问第一句里 那个t 怎么判断等待线程结束再弹出ok,而不是立刻弹出

还有操作webbrowser元素的时候怎么判断一个节点的nodename,貌似vb.net里没有nodename了,那怎么判断呢
...全文
379 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2018-03-14
  • 打赏
  • 举报
回复
如上那样修改,就是改成把每一个task加入一个LIST里,最后在LIST => ARRAY然后用waitall(array) 来判断就是正确的 但是问题又来了,我有点迷糊了,原来的写法也就是TaskGo 里直接Task.WaitAll(tasks) 和后来的写法Task.WaitAll(L.ToArray) 这2个的根本差异在哪里??? 编辑器都没有报错,前者最终导致运行报错,提示task()中至少有一个是空null ,这是为什么呢??
橘子皮... 2018-03-14
  • 打赏
  • 举报
回复
今天偶然翻出这个老帖子又研究了下,总算搞定了 首先还是感谢各位的回复,我知道这样写不合理,但是我初衷只是研究为什么会出错,而不是这么写更好 今天总算发现,问题出在TaskGo函数这里 TaskGo里的Task.WaitAll(tasks) 貌似是对的,waitall里提示是task()参数,我定义的tasks(num)也是task数组,但是其实这样写是错误的!! 正确的写法也就是微软的写法
Private Function TaskGo(ByVal tasknum As Integer) As String
        Dim tasks(tasknum) As Task
        Dim L As New List(Of Task)()

        For i = 0 To tasknum - 1
            Dim ti As Integer = i
            tasks(i) = Task.Factory.StartNew(Function() TaskGoGo(ti))
            L.Add(tasks(i))
        Next
        'Task.WaitAll(tasks)
        Task.WaitAll(L.ToArray)
        Return ""
    End Function

    Private Function TaskGoGo(ByVal ti As Integer)
        Thread.Sleep(1000)
        MsgBox("1111")
        Return Nothing
    End Function


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim t As Task
        t = New Task(Function() TaskGo(3))
        t.Start()
        t.Wait()
        MsgBox("ok")
        End
End Sub
  • 打赏
  • 举报
回复
先不要纠结“线程、Task”名词儿,先理解什么是异步回调程序设计风格。
  • 打赏
  • 举报
回复
其实你满脑都是顺序执行函数代码的那种编程思路,还没有理解异步编程思路。 当使用异步过程时,根本没有什么 wait 阻塞。当 5 个任务执行完毕,回调 “OK”,而父线程根本不是阻塞着“等待”回调。 首先理解什么叫做回调。否则连网页 javascript 程序员都懂的回调概念,c# 程序员却不理解,这就不应该了。
  • 打赏
  • 举报
回复
外部的 Task,目的就是不要让父线程被阻塞,而是子线程里边才去 WaitAll,父线程不会被他们卡死掉。结果你写了一个 t.wait 阻塞父线程,这就是让这个t (Task)变得无意义了。
秋的红果实 2017-12-27
  • 打赏
  • 举报
回复
Task还有isCompleted属性可以使用 不知道lz到底是希望挂起,还是不希望 Task.WaitAll(tasks, Cts.Token)表示所有Task数组完成后,控制权交给调用方Task t,应该是等待t完成,最后输出OK
  • 打赏
  • 举报
回复
不管你怎么说你要执行 Task.WaitAll,你的咯就是 Task.WaitAll 后边立刻执行 msgbox ("ok")(操作控件可能需要使用 control.BeginInvoke/Invoke)。总之是 t 绝不应该 wait。
  • 打赏
  • 举报
回复
task里执行task,你这是多有问题…… 外部的哪个task完全没必要
  • 打赏
  • 举报
回复
Task.WaitAll方法……
橘子皮... 2017-12-27
  • 打赏
  • 举报
回复
我现在是在TaskGoGo里加了个public的全局变量计数,每结束1个子线程+1,然后在最外面监视是不是变量=5 但是感觉太土了啊,那些个wait还有什么status怎么感觉总是不好用,有时候行有时候明明结束了就是监视不到
橘子皮... 2017-12-27
  • 打赏
  • 举报
回复
前面没说清楚,其实这段代码是报错的,错误在第3行t.wait哪里 我那个t.wait原意是想堵塞等待所有线程下的5个线程都结束然后弹出ok,但是其实报错 错误提示是task数组至少有1个空数组,应该是task数组还没创建就wait了 那个等待有一定的用处,因为有些事情没办法啊必须等全部完了才可以下一批
橘子皮... 2017-12-27
  • 打赏
  • 举报
回复
首先谢谢各位,我那个t.wait愿意是堵塞等待他执行完成,其实没发挥作用,错误提示是数组至少有1个空数组,应该是task还没创建就wait了,
  • 打赏
  • 举报
回复
Task.Run(() => { }).ContinueWith(t=>{})
ContinueWith方法,不要用wait,当然也可以简单的用async和await关键字
  • 打赏
  • 举报
回复
t.Wait() 你这段代码在阻塞线程,所以根本没什么判断……
秋的红果实 2017-12-27
  • 打赏
  • 举报
回复
你这是线程里面的线程,二级线程,首先不建议这么做,尤其在Windows下,即使是一级线程,执行起来也是“不好控的” 最后弹出OK,那就是顺序执行,无需task,直接循环调用TaskGoGo 5次即可

Private Function TaskGo(ByVal tasknum As Integer)
   For I=0 to tasknum-1
        TaskGoGo(I)
   Next
   return nothing

End Function

'调用
TaskGo(5)
msgbox ("ok")

第二个问题 只有符合CLS(公共语言规范)规范的东西,才是各种.NET语言共有的。也就是说,C#有的东西,vb不一定有,想别的办法
  • 打赏
  • 举报
回复
追求貌似高大上的 Task 名词儿,而实际上满脑子还是顺序操作的思路,这是个荒唐的事情,需要避免。
  • 打赏
  • 举报
回复
sgbox ("ok") 应该放到 TaskGo 中,根本不应该写什么 .wait。只要 run 就行了,不能胡乱wait。既然你要 wait,又何必要 Task 呢?
五更琉璃 2017-12-27
  • 打赏
  • 举报
回复
t.wait() 就是挂起当前现场,等待被唤醒了
有时想起 2017-12-27
  • 打赏
  • 举报
回复
见18#。。。。。。。。。。。
秋的红果实 2017-12-27
  • 打赏
  • 举报
回复

Task masterTask = Task.Run(new Action(() =>
        {
            taskMethod(5);
            MessageBox.Show("Return master task!");
 
        }));
    masterTask.Wait();
    
    MessageBox.Show("The main thread is completed!");

加载更多回复(1)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧