C# 静态foreach方法
我想让异步循环访问我的列表,并在并行程序中执行该方法。我想知道我怎样才能做到这一点 这是我的清单:C# 静态foreach方法,c#,C#,我想让异步循环访问我的列表,并在并行程序中执行该方法。我想知道我怎样才能做到这一点 这是我的清单: public class MakeRequest { public string file_READYTOTEST { get; set; } public string file_DONEFILE { get; set; } public string Inventory_name { get; set
public class MakeRequest
{
public string file_READYTOTEST { get; set; }
public string file_DONEFILE { get; set; }
public string Inventory_name { get; set; }
public string TimeOutFP { get; set; }
public Server server { get; set; }
}
在期末考试中,我得到了很多元素,像这样被其他人添加到列表中
IList<MakeRequest> makeRequestList;
makeRequestList.Add(new MakeRequest { file_DONEFILE = DONEFILE, file_READYTOTEST = READYTOTEST, Inventory_name = file, server = SAMaddress, TimeOutFP = IO.TimeOutFP } );
当我在同步中执行时,我是这样执行的:
foreach (MakeRequest item in makerequest)
{
Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server);
}
这就是我的方法:
//Create a soap webrequest to [Url]
public static HttpWebRequest CreateWebRequest(string ServerIP)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(ServerIP);
webRequest.Headers.Add(@"SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
return webRequest;
}
public static void Execute(string xmlFileRequest, string xmlFileResult, string InventoryElement, string TimeOutFile, Server server)
{
HttpWebRequest request = CreateWebRequest(server.ServerIP);
var soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.Load(xmlFileRequest);
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
try
{
using (WebResponse response = request.GetResponse())
{
using (var rd = new StreamReader(response.GetResponseStream()))
{
string soapResult = rd.ReadToEnd();
var xdoc = new XmlDocument();
xdoc.LoadXml(soapResult);
xdoc.Save(xmlFileResult);
}
}
}
catch (WebException e)
{
using (StreamWriter sw = File.AppendText(TimeOutFile))
{
sw.WriteLine(InventoryElement);
}
}
}
你能帮我解决一下如何使它异步吗
更新第2条主题,以便进一步讨论:
更新第3条主题,以供进一步讨论:
List mytasks=new List();
foreach(makeRequestList中的MakeRequest项)
{
Task myFirstTask=Task.Factory.StartNew(()=>Execute(item.file\u READYTOTEST,item.file\u DONEFILE,item.Inventory\u name,IO.timeoutpp,item.server));
添加(myFirstTask);
}
Task.WaitAll(mytasks.ToArray());
Console.writeline(“某物”);
Console.readline();
您可以使用任务
使其异步:
foreach (MakeRequest item in makerequest)
{
Task.Run( () => Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) );
}
若您的工作框架大于或等于3.5,那个么可以使用thread类运行到另一个循环中
Thread threadObj = null;
foreach (MakeRequest item in makerequest)
{
threadObj = new Thread(new ThreadStart(()=>Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) ));
}
在代码中,
makerequest
在哪里使用?我猜您可能在某个地方使用for/foreach循环来迭代lit并为每个项调用Execute。一种解决方案是简单地使用Parallel.For/ForEach构造。我不能在ForEach内部执行,因为线程可能会更改:item.file\u READYTOTEST,item.file\u DONEFILE在其他线程使用不同的值时可能会重写。另一方面,在锁上制作完整的foreach是没有意义的,因为这样我会得到和没有锁时相同的结果。在这种情况下,您能给我什么建议呢?是的,但如何保证每个任务线程不会在另一个任务执行期间覆盖item.file\u READYTOTEST&item.file\u DONEFILE,最终结果可能完全错误。当然,我相信我需要使用lock somwhere和Task来实现这一点。item
单个实例是否正确,是否仅在循环中引用?所以在您当前的代码中它不可能被覆盖。是的,我知道item不会有问题,但是每个循环执行Execute()方法和该方法将同时由线程执行,这是我的反对意见-你不认为一个线程的某些输入值会将其他线程当前的输入值写入该方法吗?还是我错了?不,那是不可能的。同时调用相同的方法不会导致参数被覆盖。您的意思是因为每个线程的传入值item.file\u READYTOTEST、item.file\u DONEFILE将根据我列表中的新提交元素进行区分,对吗?
List<Task> mytasks = new List<Task>();
foreach (MakeRequest item in makeRequestList)
{
Task myFirstTask = Task.Factory.StartNew(() => Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) );
mytasks.Add(myFirstTask);
}
Task.WaitAll(mytasks.ToArray());
Console.writeline("Something");
Console.readline();
foreach (MakeRequest item in makerequest)
{
Task.Run( () => Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) );
}
Thread threadObj = null;
foreach (MakeRequest item in makerequest)
{
threadObj = new Thread(new ThreadStart(()=>Execute(item.file_READYTOTEST, item.file_DONEFILE, item.Inventory_name, IO.TimeOutFP, item.server) ));
}