Vb.net 需要将Windows控制台应用程序类转换为ISynchronizeInvoke对象

Vb.net 需要将Windows控制台应用程序类转换为ISynchronizeInvoke对象,vb.net,multithreading,console-application,Vb.net,Multithreading,Console Application,我不熟悉VB.Net中的线程和同步概念 目前,我正在将Windows窗体应用程序转换为控制台应用程序。 表单应用程序使用用于异步进程的DLL: public ProcessCaller(ISynchronizeInvoke isi) : base(isi) { } 但现在,当我将这个表单应用程序转换为控制台应用程序时,我无法将控制台应用程序类传递给这个DLL 我收到错误“无法从“X”转换为“Y” 请帮帮我 提前感谢ISynchronizeInvoke用

我不熟悉VB.Net中的线程和同步概念

目前,我正在将Windows窗体应用程序转换为控制台应用程序。 表单应用程序使用用于异步进程的DLL:

    public ProcessCaller(ISynchronizeInvoke isi)
        : base(isi)
    {

    }
但现在,当我将这个表单应用程序转换为控制台应用程序时,我无法将控制台应用程序类传递给这个DLL

我收到错误“无法从“X”转换为“Y”

请帮帮我


提前感谢

ISynchronizeInvoke
用于返回到“正确”线程,通常用于所有UI操作都需要在同一线程上的客户端应用程序。这通常是通过消息泵/事件循环来完成的,而消息泵/事件循环通常不存在于控制台应用程序中

控制台应用程序中的线程要求是什么?如果没有,您可能可以编写自己的
ISynchronizeInvoke
的no-op实现,它总是从
invokererequired
等返回
false
。这里是实现的第一次尝试-未经测试,请注意

public class NoOpSynchronizeInvoke : ISynchronizeInvoke
{
    private delegate object GeneralDelegate(Delegate method,
                                            object[] args);

    public bool InvokeRequired { get { return false; } }

    public Object Invoke(Delegate method, object[] args)
    {
        return method.DynamicInvoke(args);
    }

    public IAsyncResult BeginInvoke(Delegate method,
                                    object[] args)
    {
        GeneralDelegate x = Invoke;
        return x.BeginInvoke(method, args, null, x);
    }

    public object EndInvoke(IAsyncResult result)
    {
        GeneralDelegate x = (GeneralDelegate) result.AsyncState;
        return x.EndInvoke(result);
    }
}

ISynchronizeInvoke
用于返回到“正确”线程,通常在所有UI操作都需要在同一线程上的客户端应用程序中。这通常是通过消息泵/事件循环来完成的,而消息泵/事件循环通常不存在于控制台应用程序中

控制台应用程序中的线程要求是什么?如果没有,您可能可以编写自己的
ISynchronizeInvoke
的no-op实现,它总是从
invokererequired
等返回
false
。这里是实现的第一次尝试-未经测试,请注意

public class NoOpSynchronizeInvoke : ISynchronizeInvoke
{
    private delegate object GeneralDelegate(Delegate method,
                                            object[] args);

    public bool InvokeRequired { get { return false; } }

    public Object Invoke(Delegate method, object[] args)
    {
        return method.DynamicInvoke(args);
    }

    public IAsyncResult BeginInvoke(Delegate method,
                                    object[] args)
    {
        GeneralDelegate x = Invoke;
        return x.BeginInvoke(method, args, null, x);
    }

    public object EndInvoke(IAsyncResult result)
    {
        GeneralDelegate x = (GeneralDelegate) result.AsyncState;
        return x.EndInvoke(result);
    }
}

你说你在VB.NET中工作,但是代码段是C#…?你在哪一行上得到错误?是的,我在用VB.NET代码调用用C#编写的DLL。我在VB代码中调用此方法:x=New AsyncProcess.ProcessCaller(Me),这会给我运行时错误。你说你在VB.NET中工作,但代码段是C#…?你在哪一行上得到错误?是的,我正在处理VB.NET代码,它调用用C#编写的DLL。我在VB代码中调用这个方法:x=New AsyncProcess.ProcessCaller(Me),它给了我运行时错误。John,感谢您的快速响应。我有一个项目,它是使用Win form应用程序的线程概念编写的。现在,我试图分离它的UI部分,将其转换为控制台应用程序。可以请在VB.Net中编写上述代码。Thanks@user2060435字体恐怕不行。我没有时间。你可以自己做——到处都是VB/C转换器——或者你可以把它构建成一个C#DLL,你可以从你的C#项目中引用它。约翰,谢谢你的快速回复。我有一个项目,它是使用Win form应用程序的线程概念编写的。现在,我试图分离它的UI部分,将其转换为控制台应用程序。可以请在VB.Net中编写上述代码。Thanks@user2060435字体恐怕不行。我没有时间。你可以自己做——到处都是VB/C转换器——或者你可以把它构建成一个C#DLL,从你的C#项目中引用它。