ดำเนินการคำขอเว็บหลายรายการใน WP7 หรือไม่

ฉันมีรายการที่อยู่ที่ต้องการเข้าชมโดยใช้ httpWebRequest ทั้งหมดที่ฉันต้องการคือรหัสสถานะที่เซิร์ฟเวอร์ส่งคืน

ฉันได้พยายามที่จะแนะนำพวกเขาและเริ่ม httpWebRequest กับแต่ละรายการ แต่แล้วฉันก็ได้รับเฉพาะการโทรกลับจากอันสุดท้ายเท่านั้น ดูเหมือนว่าอนุญาตให้ใช้คำขอเว็บได้ครั้งละหนึ่งคำขอเท่านั้น

ฉันมีเวลาค่อนข้างยากในการทำความเข้าใจวิธีการทำเช่นนี้โดยไม่ต้องใช้ GetResponse ซึ่งไม่ได้รับอนุญาตใน Silverlight

รหัสกำลังทำงานอยู่ในผู้ทำงานเบื้องหลัง และฉันใช้ Mango - WP7.1

ฉันจะแก้ปัญหานั้นได้อย่างไร?

foreach (var current in Addresses)
        {
            var request = HttpWebRequest.Create(current);
            request.BeginGetResponse(r =>
            {
                try
                {
                    var response = (HttpWebResponse)request.EndGetResponse(r);
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        //BOOM RECEIVED
                    });
                }
                catch (Exception)
                {
                    Debug.WriteLine("Error in EndGetResponse");
                }
            }, null);
        }

ขอบคุณล่วงหน้า =)


person Moulde    schedule 15.07.2011    source แหล่งที่มา
comment
ใช่ ฉันใช้มะม่วง =)   -  person Moulde    schedule 15.07.2011
comment
คุณได้รับ BOOM แบบไหน?   -  person CodeZombie    schedule 15.07.2011
comment
ฉันได้รับรหัสสถานะแล้วจึงอัปเดตโมเดล BOOM เป็นเพียงการแสดงให้เห็นว่ามีบางอย่างได้รับ =)   -  person Moulde    schedule 15.07.2011
comment
ฉันสงสัยว่าคุณจะสามารถทำซ้ำแบบนั้นใน Caliburn micro corouting โดยที่แต่ละคำขอจะให้ผลตอบแทน ดำเนินการส่งคืน และดำเนินต่อไป   -  person Derek Beattie    schedule 16.07.2011


คำตอบ (1)


ปัญหาเกี่ยวกับการตอบกลับครั้งเดียวของคุณมักเกิดจากการใช้วิธีการที่ไม่ระบุชื่อและวิธีการกำหนดขอบเขตเมื่อคุณใส่ลูปเหล่านี้เข้าไปข้างใน คุณกำลังละทิ้งการอ้างอิงคำขอก่อนหน้านี้ในแต่ละขั้นตอนตลอดการวนซ้ำ

ดูบล็อกโพสต์ของฉันในหัวข้อที่นี่ http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html

วิธีที่ง่ายที่สุดในการแสดงสิ่งนี้คือการเขียนโค้ดของคุณใหม่ด้วยวิธีการแบบเต็ม ซึ่งจะบังคับให้คุณพิจารณาขอบเขต แทนที่จะอ้างอิงตัวแปรภายนอกแบบสุ่มสี่สุ่มห้าในผู้รับมอบสิทธิ์ของคุณ

foreach (var current in Addresses)
{
  var request = HttpWebRequest.Create(current);
  request.BeginGetResponse(EndGetResponse, new RequestState { Request = request, Address = current });
}


private void EndGetResponse(IAsyncResult result) {
  try {
    var state = (RequestState)result.AsyncState;
    var response = (HttpWebResponse)state.Request.EndGetResponse(result);
    Deployment.Current.Dispatcher.BeginInvoke(GotResponse, state.Address, response.StatusCode);
  } catch (Exception) {
    Debug.WriteLine("Error in EndGetResponse");
  }
}

private void GotResponse(Address address, HttpStatusCode code) {
  //BOOM RECEIVED
}

public class RequestState {
  HttpWebRequest Request { get; set; }
  Address Address { get; set; }
}

เมื่อคุณแก้ไขปัญหาการกำหนดขอบเขตแล้ว คุณสามารถเขียนกลับเข้าไปในวิธีการที่ไม่ระบุชื่อเพื่อเหตุผลด้านโวหารได้หากต้องการ

วิธีนี้จะแก้ปัญหาแรกของคุณในการรับการตอบกลับทั้งหมดกลับมาเท่านั้น อย่างไรก็ตาม ฉันคิดว่าคุณต้องเรียกใช้โค้ดบางส่วนเมื่อคำขอทั้งหมดเสร็จสมบูรณ์เพื่อตรวจสอบสถานะของทั้งชุด
นั่นเป็นปัญหาที่แตกต่างออกไปโดยสิ้นเชิง

คุณไม่สามารถใช้ WaitOne() หรืออะไรทำนองนั้นได้ มันจะล็อคเธรดของคุณและหยุดคำขอไม่ให้ทำงานจริงเลย คุณอาจต้องการเรียกใช้วิธีอื่นในโค้ด BOOM ของคุณซึ่งจะเก็บผลลัพธ์และตรวจสอบว่าผลลัพธ์ทั้งหมดอยู่ในนั้นหรือไม่

person Chris Sainty    schedule 15.07.2011
comment
ฉันเห็นว่าการใช้วิธีการแบบเต็มแทนการไม่เปิดเผยตัวตนจะช่วยแก้ปัญหาได้อย่างไร แต่ฉันจะเขียนมันใหม่เป็นวิธีการที่ไม่ระบุตัวตนในภายหลังได้อย่างไร หากปัญหาอยู่ที่การใช้วิธีที่ไม่ระบุชื่อ ฉันสงสัยเพราะการทำแบบไม่เปิดเผยตัวตนทำให้การอ้างอิงวัตถุในลูปง่ายขึ้น ในโปรเจ็กต์ของฉัน ที่อยู่นั้นอยู่บนออบเจ็กต์ และคอลเลกชันที่ฉันกำลังวนซ้ำนั้นเป็นรายการของออบเจ็กต์เหล่านั้น และเมื่อได้รับการตอบกลับคำขอ ฉันต้องการออบเจ็กต์ที่เริ่มต้นคำขอเพื่อบันทึกค่าที่ส่งคืนบางส่วน - person Moulde; 15.07.2011
comment
@Moulde นั่นคือปัญหา คุณไม่สามารถอ้างอิงวัตถุนอกวิธีการไม่ระบุชื่อได้ โพสต์บล็อกของฉันจะอธิบายว่าจะเกิดอะไรขึ้นเมื่อคุณทำเช่นนั้น ฉันได้อัปเดตคำตอบเพื่อแสดงวิธีที่คุณสามารถส่งผ่านสถานะมากกว่าหนึ่งส่วนไปสู่การตอบกลับได้อย่างไร - person Chris Sainty; 16.07.2011