【问题标题】:C# DLL - multiple class objects from AssemblyC# DLL - 来自程序集的多个类对象
【发布时间】:2016-06-16 07:42:59
【问题描述】:

我有一个程序集 (Server.dll),它接收输入字符串并返回附加字符串。

我是这样使用 dll 的:

    using ServerDll;

    ServerDll.Server ob = new ServerDll.Server();
    for ( int i = 0 ; i<10; i++ )
    {
        Console.WriteLine(   ob.GiveAppendedString("Hello")    );
    }

现在,我在许多异步线程中使用这个程序集。 所以在每个线程中,我都使用上面的代码。

在不同的线程中,我能够创建 Server 对象,但是,我注意到一次只有一个线程能够在循环中使用函数 GiveAppendedString()。没有两个线程能够在各自的循环中同时使用 DLL 公开的方法。

如何实现所有线程对GiveAppendedString()函数的多线程并发调用?

我应该使用任何多线程单元模型吗?如果是,是否有任何网络链接指向我应该采取的步骤,因为我是该领域的新手。

谢谢。

[UPDATE] 简化问题:一个程序集的函数能否被多个线程(从引用程序集的应用程序)同时调用?如果是,如何?

【问题讨论】:

  • server.dll是你写的,还是第三方的?
  • @Baldrick,是的,我自己编写了 server.dll。
  • 关键是Server.dll。您应该将其设计为能够运行多线程,最终在需要时使用 .NET 并发结构(ConcurrentDictionary 等)。
  • 谢谢大家。我能够通过使方法线程安全来解决它。感谢提供的帮助。

标签: c# multithreading dll


【解决方案1】:

情况完全取决于GiveAppendedString()的实现。如果函数是用锁实现的,那么它意味着该实例同步(或者说不并发)运行。

对于其他情况,您可以使用任何asynchronous techniques 来执行并发调用。根据您的代码,我在这里提供了一个进行并发调用的示例,

  Parallel.For(0, 10,
                    i =>
                    {
                        Console.WriteLine(ob.GiveAppendedString("Hello"));
                    });

【讨论】:

  • 谢谢大家。我能够通过使方法线程安全来解决它。感谢提供的帮助。
【解决方案2】:

编辑:回答您更新后的简化问题:。您需要以线程安全的方式编写函数。这通常是一项不平凡的任务,您需要确保 GiveAppendedString 调用的所有代码都是线程安全的或位于锁定范围内。

这就是锁定的用途。将调用包装在 lock() {...} 范围内,例如

    ServerDll.Server ob = new ServerDll.Server();
    for ( int i = 0 ; i<10; i++ )
    {
        string appendedString;
        lock(ob)
        {
            ob.GiveAppendedString("Hello");
        }
        Console.WriteLine(appendedString);
    }

或者,如果可能,使GiveAppendedString 线程安全。

【讨论】:

  • 我认为 OP 实际上希望代码同时在多个线程中运行,但它不会。据我所知,锁定与此相反。
  • 这是假设对GiveAppendedString 的调用需要同时运行并且线程的原因不是外部的。无论如何,要么使方法线程安全,要么序列化调用。真的没有其他选择。
  • 感谢您的所有 cmets。我不知何故觉得,必须有一种更简单的方法来实现这一点,这样即使是传统的 VB 应用程序也可以以同样的方式使用它。这是一个简化的问题:[UPDATE] 简化的问题:一个程序集的函数可以由多个线程(从引用程序集的应用程序)同时调用吗?如果是,如何?
  • 也许我误解了你的问题。您的代码是否线程安全并且您正在询问互操作问题?
  • 谢谢大家。我能够通过使方法线程安全来解决它。感谢提供的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多