if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate()
{
textBox1.Text = args.Fax.Port.ToString();
textBox2.Text = args.Fax.FaxStatus.ToString();
}));
}
From MSDN
Delegate Sub MyDelegate(myControl As Label, myArg2 As String)
Private Sub Button_Click(sender As Object, e As EventArgs)
Dim myArray(1) As Object
myArray(0) = New Label()
myArray(1) = "Enter a Value"
myTextBox.BeginInvoke(New MyDelegate(AddressOf DelegateMethod), myArray)
End Sub
Public Sub DelegateMethod(myControl As Label, myCaption As String)
myControl.Location = New Point(16, 16)
myControl.Size = New Size(80, 25)
myControl.Text = myCaption
Me.Controls.Add(myControl)
End Sub
Итак
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate()
{
textBox1.Text = args.Fax.Port.ToString();
textBox2.Text = args.Fax.FaxStatus.ToString();
}));
}
Delegate Sub MyDelegate(faxPort As String, faxStatus As String)
If InvokeRequired Then
Dim aArray(1) as Object
aArray(0) = args.Fax.Port.ToString()
aArray(1) = args.Fax.FaxStatus.ToString();
BeginInvoke(New MyDelegate(AddressOf MySub), aArray)
End If
Sub MySub( faxPort as String, faxStatus as String)
textBox1.Text = faxPort
textBox2.Text = faxStatus
End Sub
Я думаю
Предоставлено developerfusion.com :
If InvokeRequired Then
BeginInvoke(New MethodInvoker(Function() Do
textBox1.Text = args.Fax.Port.ToString()
textBox2.Text = args.Fax.FaxStatus.ToString()
End Function))
End If
VB.NET 9 и более ранние версии не поддерживают многострочные анонимные функции. Вам нужно написать отдельную функцию:
If InvokeRequired Then
BeginInvoke(New MethodInvoker(AddressOf MySub))
End If
где MySub:
Sub MySub()
textBox1.Text = args.Fax.Port.ToString()
textBox2.Text = args.Fax.FaxStatus.ToString()
End Sub
UPDATE:
Чтобы уточнить параметр args
, существует перегрузка BeginInvoke , которую можно использовать и в этом случае делегат MethodInvoker больше не подходит. Action (Of T) будет работать:
If InvokeRequired Then
BeginInvoke(New Action(Of SomeType)(AddressOf MySub), args)
End If
и:
Sub MySub(ByVal args as SomeType)
textBox1.Text = args.Fax.Port.ToString()
textBox2.Text = args.Fax.FaxStatus.ToString()
End Sub
В конце концов, именно такие простые вещи делают разработчиков C # счастливыми :-) (пожалуйста, не поймите неправильно, я не имею ничего против VB.NET)
До Visual Studio 2010 VB.Net не поддерживает анонимные функции с несколькими операторами.
Вам нужно переместить анонимный метод в отдельный метод, который принимает args
в качестве параметра, а затем вызвать для него Invoke
.
Если вам нужны аналогичные элементы в этой функции, просто установите следующий компонент в свою визуальную студию. После этого вы можете легко конвертировать из C # в vb.net или из vb.net в C #. Поддержка VS2010 уже включена. http: //codeconvert.codeplex .com /
Поскольку комментарии не позволяют форматировать, я собираюсь опубликовать здесь свое рабочее решение. Спасибо всем, кто вмешался - Дарину, SLaks, drachenstern, Jay.
Private Sub myControl_FaxStatus(ByVal sender As Object, ByVal args As DataTech.FaxManNet.FaxEventArgs)
frmModemStatus.UpdateStatus(args.Fax)
If InvokeRequired Then
Dim aArray(1) As Object
aArray(0) = args.Fax.Port.ToString()
aArray(1) = args.Fax.FaxStatus.ToString()
BeginInvoke(New MyDelegate(AddressOf UpdateStatusDisplay), aArray)
End If
Try
TextBox1.Text = args.Fax.Port.ToString()
TextBox2.Text = args.Fax.FaxStatus.ToString()
Catch ex As Exception
System.Diagnostics.Debug.WriteLine("ex = " & ex.ToString())
End Try
End Sub
Delegate Sub MyDelegate(ByVal faxPort As String, ByVal faxStatus As String)
Private Sub UpdateStatusDisplay(ByVal faxPort As String, ByVal faxStatus As String)
TextBox1.Text = faxPort
TextBox2.Text = faxStatus
End Sub