Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C#函数转换为VB.Net,Lambda问题和最佳转换方法_C#_Vb.net - Fatal编程技术网

将C#函数转换为VB.Net,Lambda问题和最佳转换方法

将C#函数转换为VB.Net,Lambda问题和最佳转换方法,c#,vb.net,C#,Vb.net,我正在尝试将一段代码从VS2010 C#4.0框架转换为VS2008 VB.NET 3.5框架。我非常不确定如何继续,因为我不熟悉VB.NET和VS2008,我发现这两种环境之间的差异令人沮丧。我已经从最初的C#中删除了大部分不相关的代码,希望能提供一个清晰的例子来说明问题的解决方案 我确实尝试了一些代码转换器,但是lambda把它们弄错了 对于每个构造,我将第一个lambda转换为一个简单的,这似乎很好。 但是,第二个lambda(传递给ThreadPool.QueueUserWorkItem

我正在尝试将一段代码从VS2010 C#4.0框架转换为VS2008 VB.NET 3.5框架。我非常不确定如何继续,因为我不熟悉VB.NET和VS2008,我发现这两种环境之间的差异令人沮丧。我已经从最初的C#中删除了大部分不相关的代码,希望能提供一个清晰的例子来说明问题的解决方案

我确实尝试了一些代码转换器,但是lambda把它们弄错了

对于每个构造,我将第一个lambda转换为一个简单的
,这似乎很好。
但是,第二个lambda(传递给
ThreadPool.QueueUserWorkItem
调用)给我带来了不确定性。由于lambda正在使用在lambda主体之外声明的
taskcount
var,因此我对使此代码对我的目标环境(VS2008/VB.Net/3.5)友好并使代码尽可能与原始实现相似的最佳方法犹豫不决。我不希望显式地将
taskcount
推送到
WaitCallback
中,除非没有其他方法

public void sendAndBlock(List<ISendable> msgs)
{
    int taskCount = msgs.Count;
    AutoResetEvent fini = new AutoResetEvent(false);
    msgs.ForEach(m =>
    {
        ThreadPool.QueueUserWorkItem(nil =>
        {
            this.send(m);
            //threadsafe decrement and if we have no tasks left then unblock.
            if (0 == Interlocked.Decrement(ref taskCount))
            {
                fini.Set();//signal our main thread to proceed
            }
        }, m);
    });
    //block our main thread
    fini.WaitOne();
}
public void sendAndBlock(列出MSG)
{
int taskCount=msgs.Count;
AutoResetEvent fini=新的AutoResetEvent(假);
msgs.ForEach(m=>
{
ThreadPool.QueueUserWorkItem(nil=>
{
这个。发送(m);
//线程安全递减,如果没有剩余任务,则取消阻止。
如果(0==联锁减量(参考任务计数))
{
fini.Set();//通知主线程继续
}
},m);
});
//阻止我们的主线
fini.WaitOne();
}

不幸的是,Visual Studio 2008使用的VB版本将要求您将其分为三种方法(原始方法,每个lambda表达式加一种),因为旧版本的VB.Net尚不支持多行lambda表达式。我们必须进行调整,以便将lambda表达式拟合到一行中,从而正确地结束捕获的变量。如果您使用相同版本的Visual Studio,VB.Net将能够以与C#相同的方式(至少在本例中是这样),因为Visual Studio 2010附带的VB.Net版本确实支持多行lambda表达式

我想这样就可以了,但请检查一下:我在回复窗口中输入了所有这些内容,它足够复杂,我可能会有一两个错误

Public Sub sendAndBlock(ByVal msgs As List(可编辑的))
Dim taskCount As Integer=msgs.Count
Dim fini作为新自动重置事件(错误)
'vs2008的vb.net仅限于单行lambda。
但我们仍然需要创建一个闭包来捕获fini和taskCount变量
'表示我们无法将旧代码行转换为行
解决方案是将旧的lambda表达式抽象为它们自己的方法,我们可以在一行中调用它们
ForEach(函数(m)QueueMessage(m,fini,taskCount))
fini.WaitOne()
端接头
Private Sub QueueMessage(ByVal消息作为ISendable,ByVal信号器作为AutoRestEvent,ByRef任务计数作为整数)
QueueUserWorkItem(函数(n)SendQueuedMessage(消息、任务计数、信号器)、消息);
端接头
私有子SendQueuedMessage(ByVal消息作为ISendable,ByRef任务计数作为Integer,ByVal信号器作为AutoResetEvent)
发送(msg)
'不确定这一行,因为'Set'在VB中是一个保留字
如果联锁。减量(任务计数)=0,则信号器。设置()
端接头
我可能可以把它归结为两个方法,而不是三个,因为其中一个额外的方法浓缩成一行,但是为了简单和可读性,我将把它留在这里

最后,如果只需要从Visual Studio 2010中瞄准.Net 3.5就足够了,那么您可以使用更接近原始版本的东西,因为您可以使用Visual Studio 2010中较新的VB语言语法功能和.Net 3.5。

公共子sendAndBlock(msgs作为列表(可编辑))
Dim taskCount As Integer=msgs.Count
Dim fini作为新自动重置事件(错误)
msgs.ForEach(功能(m)
ThreadPool.QueueUserWorkItem(函数(nil)
发送(m)
'线程安全递减,如果没有剩余任务,则取消阻止。
如果0=联锁。减量(任务计数),则
"发出主线前进的信号,
fini.[Set]()
如果结束
端函数(m)
终端功能)
"封锁主线",
fini.WaitOne()
端接头

谢谢,

你试过这个()吗?即使转换不完全成功,它也可能为您提供一个开始的位置。VB.NET lambda非常冗长。我会完全删除第一个(ForEach),然后对每个站点做一个普通的处理。这是我尝试的第一个站点。该网站在我负责转换的大部分代码中运行良好,但似乎没有一个转换器能够处理lambda。所以,你的建议很好,但我最终还是到了现在的地步。你真的需要Visual Studio 2008,还是可以使用Visual Studio 2010针对.Net 3.5框架?允许您使用的VB.Net版本会有所不同。如果你能从VS2010为.Net 3.5编译,你可以使用更新的vb语言语法功能,这会变得容易得多。顺便说一句,你为什么要这样做?他正在为Visual Studio 2008重新移植,但我认为在Visual Studio 2010之前,你不能在vb.Net中使用多行lambda。但是,如果他只需要.net 3.5,并且仍然可以在vs2010或vs2012上编译它,那么这可能会起作用。此外,即使您使用的是VS-post-2008,它也应该转换为“Sub”lambda,而不是“Function”lambda。DeveloperFusion在这里做得不对。即使在VS>2008中,此代码也不会工作,因为