簡體   English   中英

使用Task.Run異步調用方法

[英]Calling a method asynchronously using Task.Run

有人可以幫助我如何使對方法SendSms(textMessageItems)的調用異步嗎? 最佳方法/做法是什么? 我假設可以在此處使用Task.Run Async-Await,因為我正在使用MVC4 WebApi使用.Net4.5。 但是我想聽聽專家的意見,因為我是新來的。 我在IIS7的Web服務器中使用此代碼,此方法可能需要花費一些時間來處理,因此希望以異步方式處理它,以便響應可以立即返回給調用方。 另外,由於我在for循環內調用SendSms,是否會引起任何問題? 您認為我應該將其作為收藏清單傳遞,然后進行處理嗎? 請指教。

 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;
    }          

我建議您不要使用Task.Run AFAIK,Twilio沒有async API,因此您應該向他們詢問。 您當然可以編寫自己的代碼,例如,基於HttpClient

想要異步處理它,以便響應可以立即返回給調用者

請注意, async不會更改HTTP協議 ,如我的博客所述。 在請求尚未完成處理的情況下,可能(但非常危險)從ASP.NET返回響應(也是指向我的博客的鏈接)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM