gpt4 book ai didi

vb.net - VB.NET 中的委托(delegate)中的委托(delegate)

转载 作者:行者123 更新时间:2023-12-03 13:16:28 25 4
gpt4 key购买 nike

我正在尝试编写 C# 匿名函数的 VB.NET 替代方案。

我希望调用 Threading.SynchronizationContext.Current.Send ,它期望将 Threading.SendOrPostCallback 类型的委托(delegate)传递给它。背景是here ,但是因为我希望将字符串传递给 MessageBox.Show 并捕获 DialogResult 我需要在其中定义另一个委托(delegate)。我在 VB.NET 语法中苦苦挣扎,无论是传统的委托(delegate)风格还是 lambda 函数。

我对传统语法的看法如下,但我直觉它应该比这简单得多:

Private Sub CollectMesssageBoxResultFromUserAsDelegate(ByVal messageToShow As String, ByRef wasCanceled As Boolean)
wasCanceled = False
If Windows.Forms.MessageBox.Show(String.Format("{0}{1}Please press [OK] to ignore this error and continue, or [Cancel] to stop here.", messageToShow), "Continue", Windows.Forms.MessageBoxButtons.OKCancel, Windows.Forms.MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Cancel Then
wasCanceled = True
End If
End Sub


Private Delegate Sub ShowMessageBox(ByVal messageToShow As String, ByRef canceled As Boolean)


Private Sub AskUserWhetherToCancel(ByVal message As String, ByVal args As CancelEventArgs)

If args Is Nothing Then args = New System.ComponentModel.CancelEventArgs With {.Cancel = False}

Dim wasCancelClicked As Boolean
Dim firstDelegate As New ShowMessageBox(AddressOf CollectMesssageBoxResultFromUserAsDelegate)
'…. Now what??
'I can’t declare SendOrPostCallback as below:
'Dim myDelegate As New Threading.SendOrPostCallback(AddressOf firstDelegate)


End Sub

最佳答案

我认为处理这个问题的最简单方法是创建一个新对象来包装消息框的显示。然后可以使用该对象来检索结果。

例如:

Public Class Helper 
Public WasCanceled as Boolean
Public Message As String
Public Done as New ManualResetEvent(false)
Public Sub New(message as String)
Me.Message = message
End Sub
Public Sub ShowMessageBox(unused as Object)
If MessageBox.Show(Message) = DialogResult.Cancel Then
WasCanceled = True
Done.Set()
End Sub
End Class

Public Sub AskUserWhetherToCancel(context as SynchronizationContext, message As String)
Dim helper As New Helper(message)
context.Post(AddressOf helper.ShowMessageBox, Nothing)

' Wait for it to finish
helper.WaitOne()

if helper.WasCanceled Then
...
Else
...
End IF
End Sub

关于vb.net - VB.NET 中的委托(delegate)中的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com