为什么不通过委托调用内置于.net中?

本文关键字:net 内置 调用 为什么不 | 更新日期: 2023-09-27 18:07:09

我知道。net是多线程的,这是一件好事,但是当我有一个后台工作人员时,我不断遇到问题,例如,正在更新我的窗体上的一些控件,我必须这样做:

Private Sub SetRowCellBoolValueThreadSafe(ByVal row As Integer, ByVal col As Integer, ByVal value As Boolean)
    If dgvDatabase.InvokeRequired Then
        Dim d As New SetRowCellBoolValueCallback(AddressOf SetRowCellBoolValue)
        Me.Invoke(d, New Object() {row, col, value})
    Else
        SetRowCellBoolValue(row, col, value)
    End If
End Sub
Delegate Sub SetRowCellBoolValueCallback(ByVal row As Integer, ByVal col As Integer, ByVal value As Boolean)
Private Sub SetRowCellBoolValue(ByVal row As Integer, ByVal col As Integer, ByVal value As Boolean)
    dgvDatabase.Rows(row).Cells(col).Value = value
End Sub

我的问题是为什么这不是内置于框架-当然,如果我试图更新一个DataGridView,它应该足够智能,知道何时更新来自另一个线程,它可以做所有上述本身?

为什么不通过委托调用内置于.net中?

这意味着将UI控件上的每个操作都变成委托,以防它需要被编组到不同的线程。这将是非常昂贵的。此外,它假定您总是想做同样的事情——例如,使用Invoke而不是BeginInvoke

我同意手动完成这个有点令人讨厌,但是c#和VB的下一个版本应该会让异步方法变得容易得多。

(顺便说一句,我不认为你真的想要使用ByRef的所有这些参数…有没有可能你不是很清楚ByRef是什么意思?)

我不为微软工作,但我想,

大多数用。net编写的GUI代码不是多线程的,所以为什么要承担检查少数情况的负担呢?开发人员应该知道是否存在多线程的可能性,并在适当的时候进行检查。

在BackgroundWorker的特殊情况下,我建议您使用它的进度报告特性。

你的BackgroundWorker调用ReportProgress,选择性地传递一个带有一些状态信息的对象。这会在UI线程上引发ProgressChanged事件,该事件可以使用从后台worker传递的状态信息更新表单上的控件。

进度报告不限于更新ProgressBar或类似的