【问题标题】:WCF + Singleton + File transfer + MultithreadingWCF + 单例 + 文件传输 + 多线程
【发布时间】:2013-05-20 03:06:16
【问题描述】:

我有一个使用 WCF 编写的文件传输服务。它接收客户端发送的文件。 客户端反过来使用 FileStream + MessageContract 跨文件发送。我使用以下属性将 WCF 文件传输服务设置为单例

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
 ConcurrencyMode = ConcurrencyMode.Multiple)]

我尝试在客户端本身中使用多个线程。 每个线程创建一个 channelfactory + proxy.CreateChannel 的实例,并通过一个不同的文件发送给服务。我在服务端没有任何锁,它一次只允许传输一个文件,在客户端也没有。该代码是一种没有状态持久性的直通代码。

我面临的问题是,我没有看到多个线程尝试发送多个文件。每次我尝试使用多个线程传输多个文件时,服务类型都不接受同一实例中的多个文件。这导致文件被顺序传输而不是并行传输。我觉得从客户端发送了文件,但在服务端它只是被阻止了。

我尝试使用 ServiceThrottling 属性,但仍然没有发现任何区别。 我做错了什么还是这种方法无效?

一个客户端只能通过一个通道发送一个文件?许多线程不能将许多文件发送到同一个服务吗?谁能帮帮我。

谢谢 桑迪普

【问题讨论】:

  • 我成功了,我在服务的入口点有一个锁定对象。但我又面临一个问题。一次只传输两个文件。我需要添加任何其他待定配置吗?

标签: c# multithreading wcf singleton


【解决方案1】:

我讨厌承认我在这个系列中遇到的愚蠢错误,但我承认,我是多么愚蠢。

  1. 单线程执行的原因。 由于我在服务入口的开头立即加了锁,因此在等待休息时只允许一个线程。

  2. 执行几个线程而不是多个线程的原因。 由于带宽只有 2MBPS,而且我尝试传输 10 个文件,每个文件 10MB,我假设网络阻塞。当我尝试使用 10 个文件时,每个 100KB 多线程的工作就像一个魅力,我还能够使用 maxConcurrentCalls 控制线程的入口。

大家干杯,感谢 YK1

顺便说一句。如果我错了,请纠正我关于网络带宽是罪魁祸首的假设。

【讨论】:

    【解决方案2】:

    尝试在您的客户端中将属性 ServicePointManager.DefaultConnectionLimit 设置为大于 2。

    【讨论】:

    • 不,伙计,我删除了整段代码,而是添加了一个简单的 Debug.Writeline 并将服务托管在控制台应用程序中。令我惊讶的是,我可以看到,在一个线程完成执行之前,不允许下一个线程。我尝试设置上述属性但几乎没有用。同时我尝试了一个示例应用程序,它真的很像一个魅力。基于 serviceThrottling 中的 maxConcurrentCalls,我可以控制进入服务的线程数。真的不知道发生了什么。和 MessageContract 有关系吗?
    • 好的 - 你的评论 Only two files are getting transferred at one point. 让我怀疑这个配置。我希望您正确地使用代理进行并发呼叫 - 而不是在您进行第二次呼叫之前等待第一个响应到达。
    • 另外,通过在每个线程中创建代理 - 您的客户端将创建到服务的多个连接。而是只创建一个代理并在客户端的所有线程之间共享它 - 看看这是否会改变行为
    • 我不能在不同的线程之间共享代理,因为,我有一个场景在一个实例中生成多个文件,我必须将它们发送到服务。我不能等待一个文件在另一个文件之前传输,因为我有 2MBPS 线路要测试(而且我不知道生产带宽)并且我使用 https.. 所以它相当慢.. 20MB 文件 = 6-7 分钟。所以我更喜欢在不同的线程上有多个代理。顺便提一句。我正在使用控制台主机进行调试,会及时通知您!干杯,
    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多