C# 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

在一个循环中,我正在使用task.Run(//…)创建一个任务。每个任务都包含一个WebRequest。在Task.WaitAll,一个任务的结果被另一个任务的结果覆盖。我怎么了? 使用调试器进行尝试时,效果良好。是因为并发吗?如何解决这个问题? 下面是我的代码片段:

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#5
foreach
循环开始,它不做这件事哪种版本的C#?操作如何WithWebRequestImplemented?它是否使用任何可能导致问题的实例变量?尝试制作一个列表并使用.add(t)添加它们.Hsa可能与传递引用有关。我认为这是
的捕获问题。我会找到一个链接…给我一点时间。它回答了你的问题吗?看起来,你面临着变量循环捕获。但从C#5
foreach
循环开始并不能做到这一点