C# 如何知道HttpWebClientProtocol类是否是线程安全的?

C# 如何知道HttpWebClientProtocol类是否是线程安全的?,c#,C#,我读了这个问题,但答案和讨论让我感到困惑 所以我决定检查一下,但我该怎么做呢?如何创建一个测试来证明HttpWebClient协议是否是线程安全的 我已经做了以下测试: 创建一个HttpWebClientProtocol来调用WS 我自己创建WS,里面只有一个线程。Sleep(30000) 因此,我创建了两个独立的线程来同时调用这个HttpWebClientProtocol 结果是:两个线程都调用了WS,没有问题。(一个线程不需要等待第一次调用结束) 通过这个测试,我已经证明了对象是线程安全的,

我读了这个问题,但答案和讨论让我感到困惑

所以我决定检查一下,但我该怎么做呢?如何创建一个测试来证明HttpWebClient协议是否是线程安全的

我已经做了以下测试:

  • 创建一个
    HttpWebClientProtocol
    来调用WS
  • 我自己创建WS,里面只有一个
    线程。Sleep(30000)
  • 因此,我创建了两个独立的
    线程
    来同时调用这个
    HttpWebClientProtocol
  • 结果是:两个
    线程都调用了WS,没有问题。(一个
    线程不需要等待第一次调用结束)

  • 通过这个测试,我已经证明了对象是线程安全的,而另一个问题的“正确”答案是错误的???

    好吧……我有一个更好的测试给你

    直接从MSDN获得。以下是他们关于线程安全的一份说明:

    线程安全 对于每个XML Web服务方法调用,此类上的属性都会复制到WebRequest对象的新实例中。虽然您可以同时从不同线程调用同一WebClientProtocol实例上的XML Web服务方法,但没有执行同步以确保属性的一致快照获得Transfer因此,如果需要修改属性并从不同线程进行并发方法调用,则应使用XML Web服务代理的不同实例或提供自己的同步

    关于线程安全 这不仅仅是“可用”,而是要确保受一个线程影响的数据/状态不会影响另一个线程的正确执行

    如果它们共享数据结构,并且这些结构在线程之间共享,那么它们就不是线程安全的。这个问题可能不太明显,但在多线程系统中大量使用该类的系统上,您可能会发现一些无法在开发环境中重现的错误/异常/怪异行为“只发生在生产中”

    我的朋友,不是线程安全的

    关于HttpWebClientProtocol以及为什么它不是线程安全的 虽然文档清楚地说明了如何重用HttpWebClientProtocol,但重要的是要知道对象本身的所有属性不会持久化到在另一个线程上创建的其他请求

    这意味着,如果您有两个线程使用
    Credentials
    属性,您可能会得到一些具有不同凭据的请求。这在具有模拟功能的web应用程序中是不好的,在该应用程序中,请求可以使用不同的凭据完成,而您可能会得到其他人的数据


    但是,如果只需要设置一次初始属性,则可以。您可以重用该实例。

    这里有什么问题要理解吗?“不,它不是线程安全的。客户端必须处于打开状态才能启用调用。一个线程执行client.Close()而另一个线程尝试调用方法的简单场景将失败。“简单地说,不,不是。如果您想测试它,您应该阅读有关多线程以及如何使用它的内容。但是你也应该知道这样的测试不是很可靠。你读过第二篇文章中的线程安全吗?@mikus说的。即使某些东西不是线程安全的,您也可以运行几十个测试,但不能保证它会有任何问题。多线程是一件棘手的事情,您可能会在测试中遇到不一致的行为。谢谢您的回答,哦,MSDN的这个主题正是我自己得出的结论,它确实是线程安全的,但前提是我不需要为每个调用更改对象的属性;它与MSDN中提到的“线程安全”一样。没有了。同样如此。没有辩论。没有争论。是的,是的,但不是。哈哈,不是。您可以对它进行多线程调用,但如果您开始更改属性(如
    EnableDecompression
    等),则它们可能会影响其他线程,因为您基本上是在同一实例上执行操作。这就是“非线程安全”的确切定义。一个线程中的一个更改会影响另一个线程。如果不必多次使用这些属性,那么可以在多线程场景中重用这些对象。但它不是线程安全的。答案很好,现在我明白了。答复:)