gpt4 book ai didi

带有 WebRequest 的 C# 多线程程序

转载 作者:数据小太阳 更新时间:2023-10-29 02:15:23 25 4
gpt4 key购买 nike

首先我是论坛的新人所以请对我和我的英语有点耐心。 :-)

我正在编写一个 C# 应用程序,它应该将多线程 SOAP 请求发送到 apache 后端。到目前为止一切正常,但我遇到了问题。应用程序首先读取一个 XML 文件来自另一个系统,首先被解析为类,排序并发送到 SOAP 后端。这里是片段

List<Thread> ThreadsPerOneRecord = new List<Thread>();         
bool ExecuteSingleThreaded = false;
//The variable list is passed as parameter to the function

foreach (Record prov in list)
{
XMLResult.AppendText("Type: " + prov.Type + Environment.NewLine);

Thread t = new Thread(() => Send(prov, c));
t.Start();
//Here the sleep
Thread.Sleep(50);
ThreadsPerOneRecord.Add(t);

#region Code for test single threaded execution
if (ExecuteSingleThreaded)
{
foreach (Thread t2 in ThreadsPerOneRecord)
t2.Join();
ThreadsPerOneRecord.Clear();
}
#endregion
}

XMLResult.AppendText("Waiting for the threads to finish" + Environment.NewLine);
//Waiting for the threads to finish
foreach (Thread t in ThreadsPerOneRecord)
t.Join();

当我将其发送到 SOAP Web 服务时,它工作正常,但有一个请求除外。这些请求相互混淆。即:

What it should be: 
Record 1 -> SOAP
Record 2 -> SOAP
Record 3 -> SOAP

What it is
Record 1 -> SOAP
Record 2 -> SOAP
Record 2 -> SOAP
Record 3 -> nowhere

我已经尝试调试整个代码,使用调试器它工作正常。当我插入这个 50 毫秒的 sleep 时也是如此。但是如果没有 sleep ,它会将这两个记录混合在一起......

有人知道为什么会这样吗?每个线程不应该独立于自身吗?我还检查了集合,数据在里面是正确的。

谢谢

老战士

最佳答案

替换

Thread t = new Thread(() => Send(prov, c));
t.Start();

Thread t = new Thread(item => Send(item, c));
t.Start(prov);

在您的代码中,lambda 表达式实际上看到了对迭代器变量的更改(每个线程都是相同的变量,而不是将 lambda 传递给线程构造函数时捕获的值)。

关于带有 WebRequest 的 C# 多线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com