IProgress没有报告

时间:2018-04-05 08:25:29

标签: vb.net async-await progress-bar

我有以下代码来报告进度。函数CalculateMandelbrot()似乎异步,但我的进度条没有显示任何内容。

Public Class Form1
    Private Async Function Button1_Click(sender As Object, e As EventArgs) As Task Handles Button1.Click
        Dim prog As Progress(Of Integer) = New Progress(Of Integer)(Function(x) ProgressBar1.Value = x)
        Await Task.Run(Function() CalculateMandelbrot(prog))
        Dim ende As Boolean = True
    End Function

    Private Function CalculateMandelbrot(ByVal progress As IProgress(Of Integer))
        For xi = 0 To 100
            Threading.Thread.Sleep(40)
            progress.Report(xi)
        Next
        Return 42
    End Function
End Class

1 个答案:

答案 0 :(得分:4)

   Dim prog = New Progress(Of Integer)(Function(x) ProgressBar1.Value = x)

编译器非常努力地理解这段代码。请注意,lambda表达式是一个Function,函数需要有一个返回值。它从何而来? lambda表达式的返回值类型是什么?

希望你能看到陷阱。它唯一能做的就是假设你要返回一个布尔值。因此,您可以比较Value和x的值。换句话说,它被编译为Return (ProgressBar1.Value = x)。一个布尔值,该返回值实际上没有被使用。

不是作业,因此没有进度条更新。写得正确以修复错误:

   Dim prog = New Progress(Of Integer)(Sub(x) ProgressBar1.Value = x)