C# Task.WaitAll-结果被覆盖
在一个循环中,我正在使用task.Run(//…)创建一个任务。每个任务都包含一个WebRequest。在Task.WaitAll,一个任务的结果被另一个任务的结果覆盖。我怎么了? 使用调试器进行尝试时,效果良好。是因为并发吗?如何解决这个问题? 下面是我的代码片段:C# Task.WaitAll-结果被覆盖,c#,.net,c#-5.0,C#,.net,C# 5.0,在一个循环中,我正在使用task.Run(//…)创建一个任务。每个任务都包含一个WebRequest。在Task.WaitAll,一个任务的结果被另一个任务的结果覆盖。我怎么了? 使用调试器进行尝试时,效果良好。是因为并发吗?如何解决这个问题? 下面是我的代码片段: SomeMethod() { //someItemList.Count() == 5 int r = 0; Task<MyModel>[] myTaskList= new Task<MyMode
SomeMethod()
{
//someItemList.Count() == 5
int r = 0;
Task<MyModel>[] myTaskList= new Task<MyModel>[5];
foreach(var item in someItemList){
Task<MyModel> t = Task<MyModel>.Run(() => { return
SomeOperationWithWebRequest(item); });
myTaskList[r] = t;
r++;
}
Task.WaitAll(myTaskList); //myTaskList[0].Result...myTaskList[4].Result all are having same output.
}
MyModel SomeOperationwithWebRequest(Item){
string URL = "SomeURLFromItem";
string DATA = "DATAfromItem"
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = DATA.Length;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
requestWriter.Write(DATA);
}
try
{
WebResponse webResponse = request.GetResponseAsync();
using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
using (StreamReader responseReader = new StreamReader(webStream))
{
//response
}
catch (Exception ex)
{
}
return new MyModel() { // properties
};
}
SomeMethod()
{
//someItemList.Count()==5
int r=0;
任务[]myTaskList=新任务[5];
foreach(someItemList中的变量项){
Task t=Task.Run(()=>{return
带有WebRequest(项);}的某些操作;
myTaskList[r]=t;
r++;
}
Task.WaitAll(myTaskList);//myTaskList[0]。结果…myTaskList[4]。结果都具有相同的输出。
}
MyModel SomeOperationwithWebRequest(项目){
字符串URL=“SomeURLFromItem”;
string DATA=“DATAfromItem”
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(URL);
request.Method=“POST”;
request.ContentType=“application/json”;
request.ContentLength=DATA.Length;
使用(Stream webStream=request.GetRequestStream())
使用(StreamWriter requestWriter=newstreamwriter(webStream,System.Text.Encoding.ASCII))
{
requestWriter.Write(数据);
}
尝试
{
WebResponse WebResponse=request.GetResponseAsync();
使用(Stream webStream=webResponse.GetResponseStream()??Stream.Null)
使用(StreamReader responseReader=新的StreamReader(webStream))
{
//回应
}
捕获(例外情况除外)
{
}
返回新的MyModel(){//properties
};
}
我认为它在调试中有效,因为您不等待异步WebRequest。请尝试以下操作:
private readonly List<string> _someItemList = new List<string> { "t1", "t2", "t3" };
private async Task SomeMethodAsync()
{
var myTaskList = new List<Task<MyModel>>();
int counter = 0;
foreach (var item in _someItemList)
{
var t = Task.Run(() => SomeOperationWithWebRequestAsync(counter++));
myTaskList.Add(t);
}
await Task.WhenAll(myTaskList);
}
public async Task<MyModel> SomeOperationWithWebRequestAsync(int counter)
{
//do your async request, for simplicity I just do a delay
await Task.Delay(counter * 1000);
return new MyModel {Counter = counter };
}
public class MyModel
{
public int Counter { get; set; }
}
还要注意Task.WhenAll与Task.WaitAll的比较,参见例如
我认为它在调试中有效,因为您不等待异步WebRequest。请尝试以下操作:
private readonly List<string> _someItemList = new List<string> { "t1", "t2", "t3" };
private async Task SomeMethodAsync()
{
var myTaskList = new List<Task<MyModel>>();
int counter = 0;
foreach (var item in _someItemList)
{
var t = Task.Run(() => SomeOperationWithWebRequestAsync(counter++));
myTaskList.Add(t);
}
await Task.WhenAll(myTaskList);
}
public async Task<MyModel> SomeOperationWithWebRequestAsync(int counter)
{
//do your async request, for simplicity I just do a delay
await Task.Delay(counter * 1000);
return new MyModel {Counter = counter };
}
public class MyModel
{
public int Counter { get; set; }
}
还要注意Task.WhenAll与Task.WaitAll的比较,参见例如
C#的哪个版本?如何推动WebRequest的某些操作?它是否使用任何可能导致问题的实例变量?尝试制作一个列表并使用.add(t)添加它们.Hsa可能与传递的引用有关。我认为这与
项的捕获有关。我会找到一个链接…给我一点时间。它回答了你的问题吗?看起来,你面临着变量循环捕获。但是从C#5foreach
循环开始,它不做这件事哪种版本的C#?操作如何WithWebRequestImplemented?它是否使用任何可能导致问题的实例变量?尝试制作一个列表并使用.add(t)添加它们.Hsa可能与传递引用有关。我认为这是项
的捕获问题。我会找到一个链接…给我一点时间。它回答了你的问题吗?看起来,你面临着变量循环捕获。但从C#5foreach
循环开始并不能做到这一点