Memanggil metode secara asinkron menggunakan Task.Run

Adakah yang bisa membantu saya cara melakukan panggilan ke metode SendSms(textMessageItems) asynchronous? Apa metode/praktik terbaik? Saya berasumsi bahwa Task.Run Async-Await dapat digunakan di sini karena saya menggunakan .Net4.5 menggunakan MVC4 WebApi. Tapi saya ingin mendengar dari para ahli karena saya baru dalam hal ini. Saya menggunakan kode ini di Server web saya yang ada di IIS7 dan metode ini memerlukan waktu untuk diproses sehingga saya ingin memprosesnya secara asinkron sehingga respons dapat segera kembali ke pemanggil. Juga karena saya memanggil SendSms di dalam loop for, apakah itu akan menimbulkan masalah? Apakah menurut Anda saya harus meneruskannya sebagai Daftar koleksi dan kemudian memprosesnya? Mohon saran.

 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 sumber


Jawaban (1)


Saya menyarankan Anda untuk tidak menggunakan Task.Run. AFAIK, Twilio tidak memiliki async API, jadi Anda harus menanyakannya kepada mereka. Anda tentu saja dapat menulis sendiri, misalnya berdasarkan HttpClient.

ingin memprosesnya secara asinkron sehingga responsnya dapat segera kembali ke pemanggil

Harap perhatikan bahwa async tidak mengubah protokol HTTP, seperti yang dijelaskan di blog saya. mungkin, namun sangat berbahaya, untuk mengembalikan respon dari ASP.NET saat permintaan belum selesai diproses (juga link ke blog saya).

person Stephen Cleary    schedule 28.01.2014
comment
Sebenarnya responnya hanya berupa respon HTTP OK dan tidak ada yang lain. Balasan SMS masuk dikirim melalui SMS keluar dan sebenarnya tidak terikat dengan SMS masuk. Bagian itu ditangani oleh textService.SendSmsMessage. Apakah itu masuk akal? - person Ditty; 29.01.2014
comment
@Ditty: Ya, dan saran saya masih berlaku. Ini masih sangat berbahaya. Layanan web Anda seharusnya hanya menyimpan data permintaan ke dalam antrean yang andal (misalnya, antrean Azure/MSMQ) dan memiliki proses backend terpisah yang mengirimkan respons SMS (misalnya, peran pekerja Azure/layanan Win32). - person Stephen Cleary; 29.01.2014
comment
Jadi meskipun itu adalah jenis panggilan kebakaran dan lupa, apakah Anda tetap akan menyarankan hal yang sama? Saya melihat di artikel Anda blog.stephencleary.com/2012 /12/ di bawah Tanya Jawab Anda menyebutkan sesuatu tentang penggunaan Async dengan menunggu. Apakah itu akan berhasil di sini atau tetap tidak direkomendasikan? - person Ditty; 29.01.2014
comment
@Ditty: Anda dapat menggunakan async dan await dengan baik. Tapi itu tidak akan memberikan respons kepada penelepon. - person Stephen Cleary; 29.01.2014
comment
Maksud Anda server akan menunggu proses async selesai karena menunggu sebelum mengirim kembali respons HTTP? Apakah itu yang kamu maksud? - person Ditty; 29.01.2014
comment
@Ditty: Ya, server akan menunggu async handler selesai. - person Stephen Cleary; 29.01.2014