การเรียกวิธีการแบบอะซิงโครนัสโดยใช้ Task.Run

ใครสามารถช่วยฉันวิธีการเรียกเมธอด SendSms (textMessageItems) แบบอะซิงโครนัสได้บ้าง วิธีการ/แนวทางปฏิบัติที่ดีที่สุดคืออะไร? ฉันคิดว่า Task.Run Async-Await สามารถใช้ได้ที่นี่เนื่องจากฉันใช้ .Net4.5 โดยใช้ MVC4 WebApi แต่ฉันอยากได้ยินจากผู้เชี่ยวชาญเพราะฉันยังใหม่กับเรื่องนี้ ฉันใช้รหัสนี้บนเว็บเซิร์ฟเวอร์ของฉันซึ่งอยู่ใน IIS7 และวิธีการนี้อาจใช้เวลาในการประมวลผลและต้องการประมวลผลแบบอะซิงโครนัสเพื่อให้การตอบกลับสามารถส่งคืนไปยังผู้โทรได้ทันที นอกจากนี้เนื่องจากฉันกำลังเรียก SendSms ภายใน for loop มันจะทำให้เกิดปัญหาหรือไม่ คุณคิดว่าฉันควรส่งต่อเป็นรายการคอลเลกชันแล้วดำเนินการหรือไม่? กรุณาแนะนำ.

 using Twilio.Mvc;
 using Twilio.TwiML.Mvc;
 using Twilio.TwiML;


public class SmsController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post([FromBody]SmsRequest smsReq)
    {
            var response = new Twilio.TwiML.TwilioResponse();
            //validation checks..

            try
            {


                if ((txtMessageResponse != null) && (txtMessageResponse.SmsMessageInfo.Count > 0))
                {
                    _smsStagingList = txtMessageResponse.SmsMessageInfo;
                    foreach (TextMessageStaging prepareTextMessageResponse in _smsStagingList)
                    {
                        smsDTO textMessageItems = new smsDTO();
                        textMessageItems.PhoneNumber = prepareTextMessageResponse.PhoneNumber;
                        textMessageItems.SmsMessage = prepareTextMessageResponse.SmsMessageBody;

                        isTxtMessageSent = SendSms(textMessageItems);

                        //If the messages were sent then no need to set the flag to be updated 
                        if (isTxtMessageSent)
                        {
                            txtMessageStatusToBeUpdated = false;
                        }
                    }
                    return Request.CreateResponse(HttpStatusCode.OK, twilioResponse.Element);
                }
                else
                {
                    //send error response
                }
            catch (Exception msgProcessingError)
            {
              //send error response again as processing error
            }
            finally
            {
             //set the outbound flag in the table
            }
     }


    private bool SendSms(smsDTO textMessageItems)
    {
        bool isTxtMessageSent = false;
        PushMessageRequest txtMessageRequest = new PushMessageRequest();
        PushMessageResponse txtMessageResponse = null;
        txtMessageRequest.SmsMessageInfo = new SendTextMessage(); //instantiate the dto

        txtMessageRequest.SmsMessageInfo.ToPhone = textMessageItems.PhoneNumber;
        txtMessageRequest.SmsMessageInfo.TextMessage = textMessageItems.SmsMessage;
        try
        {
            using (ITextService textService = ObjectFactory.SendSmsMessage())
            {
                txtMessageResponse = textService.SendSmsMessage(txtMessageRequest);
            }

            isTxtMessageSent = txtMessageResponse.IsSuccessful;
        }
        catch (Exception ex)
        {
            isTxtMessageSent = false;
        }      
        return isTxtMessageSent;
    }          

person Ditty    schedule 28.01.2014    source แหล่งที่มา


คำตอบ (1)


ฉันขอแนะนำไม่ให้คุณใช้ Task.Run AFAIK, Twilio ไม่มี async API ดังนั้นคุณควรถามพวกเขาเกี่ยวกับเรื่องนั้น แน่นอนคุณสามารถเขียนของคุณเองได้ เช่น ตาม HttpClient

ต้องการประมวลผลแบบอะซิงโครนัสเพื่อให้สามารถตอบกลับไปยังผู้โทรได้ทันที

โปรดทราบว่า async จะไม่เปลี่ยนโปรโตคอล HTTP ตามที่อธิบายไว้ในบล็อกของฉัน เป็นไปได้ แต่มีอันตรายอย่างยิ่ง ส่งคืนการตอบกลับจาก ASP.NET ในขณะที่คำขอยังประมวลผลไม่เสร็จ (รวมถึงลิงก์ไปยังบล็อกของฉันด้วย)

person Stephen Cleary    schedule 28.01.2014
comment
จริงๆ แล้วการตอบสนองจะเป็นเพียงการตอบสนอง HTTP OK เท่านั้นและไม่มีอะไรอื่นอีก การตอบกลับข้อความขาเข้าจะถูกส่งผ่านข้อความขาออก และจริงๆ แล้วไม่ได้เชื่อมโยงกับข้อความขาเข้า ส่วนนั้นได้รับการดูแลโดย textService.SendSmsMessage นั่นสมเหตุสมผลไหม? - person Ditty; 29.01.2014
comment
@Ditty: ใช่ และคำแนะนำของฉันยังคงอยู่ มันยังคงเป็นอันตรายอย่างยิ่ง บริการเว็บของคุณควรเก็บข้อมูลคำขอไว้ในคิวที่เชื่อถือได้ (เช่น คิว Azure / MSMQ) และมีกระบวนการแบ็กเอนด์แยกต่างหากส่งการตอบกลับทาง SMS (เช่น บทบาทผู้ปฏิบัติงาน Azure / บริการ Win32) - person Stephen Cleary; 29.01.2014
comment
ดังนั้นถึงแม้ไฟจะลุกไหม้และลืมการโทร คุณจะยังแนะนำเหมือนเดิมหรือไม่? ฉันเห็นในบทความของคุณ blog.stephencleary.com/2012 /12/ ภายใต้คำถาม & คำตอบ คุณได้พูดถึงบางอย่างเกี่ยวกับการใช้ Async ด้วยการ await มันจะใช้งานได้ที่นี่หรือยังไม่แนะนำ? - person Ditty; 29.01.2014
comment
@Ditty: คุณสามารถใช้ async และ await ได้ดี แต่จะไม่ตอบกลับผู้โทร - person Stephen Cleary; 29.01.2014
comment
คุณหมายถึงเซิร์ฟเวอร์จะรอให้กระบวนการ asynch เสร็จสิ้นเนื่องจากรอก่อนจึงจะส่งการตอบกลับ HTTP กลับ นั่นคือสิ่งที่คุณหมายถึง? - person Ditty; 29.01.2014
comment
@Ditty: ใช่ เซิร์ฟเวอร์จะรอให้ตัวจัดการ async ดำเนินการให้เสร็จสิ้น - person Stephen Cleary; 29.01.2014