将 C# 线程启动委托转换为 VB.NET
本文关键字:转换 VB NET 线程 启动 | 更新日期: 2023-09-27 18:30:34
我需要将 C# 代码转换为 VB.NET
代码(基于 .NET 3.5 和 VS 2008),但我在将 C# 委托转换为其等效 VB.NET 时遇到问题。
我要转换的 C# 代码工作正常,如下所示:
protected override void OnOwnerInitialized()
{
if (!MobileApplication.Current.Dispatcher.CheckAccess())
{
// MobileApplication.Current is some 3rd party API
// MobileApplication.Current.Dispatcher is type System.Windows.Threading.Dispatcher
MobileApplication.Current.Dispatcher.BeginInvoke
(
(System.Threading.ThreadStart)delegate()
{
OnOwnerInitialized();
}
);
return;
}
DoSomething();
}
我翻译成以下 VB.NET 代码,但它不起作用:
Protected Overrides Sub OnOwnerInitialized()
If Not MobileApplication.Current.Dispatcher.CheckAccess() Then
MobileApplication.Current.Dispatcher.BeginInvoke(Function() New System.Threading.ThreadStart(AddressOf OnOwnerInitialized))
Return
End If
' I also tried the following but I get thread related errors elsewhere in code
'If ((Not MobileApplication.Current.Dispatcher.CheckAccess()) And (Not threadStarted)) Then
' Dim newThread As New Thread(AddressOf OnOwnerInitialized)
' newThread.Start()
' threadStarted = True ' this is a shared / static variable
' Return
'End If
DoSomething()
End Sub
使用 C# 代码,OnOwnerInitialized() 被调用两次。在第一次调用时,该函数与"return;"语句一起存在;第二次调用'DoSomething()。这是正确的行为。但是,在 VB.NET 代码中,它只运行一次,代码确实返回"Return"语句,仅此而已(我相信我翻译的 VB.NET 代码调用线程不正确。下面的代码是 C# 代码)。
谢谢。
看起来你可以缩短它。
http://msdn.microsoft.com/en-us/library/57s77029(v=vs.100).aspx?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.线程。THREADSTART)%3bk(VS.OBJECTBROWSER)%3bk(TargetFrameworkMoniker-".NETFRAMEWORK,VERSION%3dV4.0")&rd=true&cs-save-lang=1&cs-lang=vb#code-snippet-2
Protected Overrides Sub OnOwnerInitialized()
If Not MobileApplication.Current.Dispatcher.CheckAccess() Then
MobileApplication.Current.Dispatcher.BeginInvoke(AddressOf OnOwnerInitialized)
Return
End If
DoSomething()
End Sub
我想我明白了:
Protected Overrides Sub OnOwnerInitialized()
If Not MobileApplication.Current.Dispatcher.CheckAccess() Then
MobileApplication.Current.Dispatcher.BeginInvoke(DirectCast(Function() DoSomethingWrapper(), System.Threading.ThreadStart))
Return
End If
End If
Private Function DoSomethingWrapper() As Boolean
DoSomething()
Return True ' dummy value to satisfy that this is a function
End If
基本上,我认为因为我使用的是.NET 3.5,所以下面的行只能接受一个函数,而不能接受子:
MobileApplication.Current.Dispatcher.BeginInvoke(DirectCast(Function() RunExtension(), System.Threading.ThreadStart))
现在因为 OnOwnerInitialized() 必须是一个 sub(因为它覆盖了一个 sub),而 BeginInvoke 必须接受一个函数,我刚刚添加了一个包装函数来包装 DoSomething(),所以 OnOwnerInitialized() 可以通过该包装函数调用 DoSomething()。