Я пытаюсь написать альтернативу VB.NET для анонимной функции C#.Делегат в делегате в VB.NET
Я хочу вызвать Threading.SynchronizationContext.Current.Send, который ожидает, что ему будет передан делегат типа Threading.SendOrPostCallback. Фон here, но поскольку я хочу, чтобы оба передавали строку в MessageBox.Show, а также захватили DialogResult, мне нужно определить другой делегат внутри. Я борюсь с синтаксисом VB.NET, как из традиционного стиля делегата, так и из лямбда-функций.
Мой идти в традиционном синтаксисе ниже, но я кишка чувство, что это должно быть намного проще, чем это:
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
Великий, Благодаря Джареду это сработало хорошо. Я схватил SynchronizationContext формы в конструкторе формы и использовал это как контекст для Post to. Мне не нужно было WaitOne или использовать ManualResetEvent, потому что я делал Post (синхронно), а не Send (async). Дополнительные ссылки на SynchronizationContext: http://blogs.msdn.com/mattdotson/archive/2006/02/13/531315.aspx и http://www.codeproject.com/KB/cpp/SyncContextTutorial.aspx – Topdown