2014-02-26 185 views
0

我有以下功能:轉換功能,以異步任務

private void SendSMSs(List<SMS> smsList) 
    { 
     foreach (var sms in smsList) 
     { 
      SendSMS smsSend = new SendSMS(sms.message, sms.number, 0, SmsResponseCallback); 
      Console.WriteLine("Sent a SMS to " + sms.number); 
     } 
    } 

    /// <summary> 
    /// Call back for sending a sms 
    /// </summary> 
    public void SmsResponseCallback(FSK_SendSMS.FSK_SendSMS.SMS_Result result) 
    { 
     Console.WriteLine("Succesfully sent a SMS to " + result.Destination + " with result: " + result.Result); 
    } 

現在我的問題是,每條短信等待,直到它從接收方的響應。

我想爲每個需要發送的短信創建一個任務。這樣它們都可以異步發送。

函數SendSMSs確實需要等待任務完成芬蘭語。它必須儘快返回,然後短信將在他們自己的時間發送?

那麼,我該如何創建一個可以馬上開始的任務,然後我可以繼續創建下一個任務。

+3

你可以通過將它包裝在'Task.Run'中。但是... [在你做之前](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx) –

+0

你的目標框架是什麼? –

回答

0

可以使用System.Threading.Tasks

foreach(SMS sms in smsList) 
{ 
    var t = Task.Factory.StartNew(new Action(SendOneSMS(sms))); 
} 
+1

這不是OP要求的。他要求創建一個「任務」而不是「線程」。 'Thread' **!= **'Task' –

+0

我知道。我提供了一種不使用任務來完成要求的方法。 – Avishek

+0

除非這是更好/更有效的答案。我只是覺得TPL(任務並行庫)是最簡單/最好/最新的方法。我可能是非常錯誤,雖然 – Zapnologica

0

做這樣的事情using System.Threading;

private void SendSMSs(List<SMS> smsList) 
{ 
    foreach(SMS sms in smsList) 
    { 
     Thread thread = new Thread(new ParameterizedThreadStart(SendOneSMS(sms))); 
    } 
} 

private void SendOneSMS(SMS sms) 
{ 
    SendSMS smsSend = new SendSMS(sms.message, sms.number, 0, SmsResponseCallback); 
    Console.WriteLine("Sent a SMS to " + sms.number); 
} 

做同樣的工作與Task如果發送短信的功能不具有異步選擇,你可以使用TPL啓動任務,最終將阻止發送短信的線程:

private Task SendSMSs(List<SMS> smsList) 
{ 
    return Task.WhenAll(from sms in smsList select SendSMS(sms)); 
} 

private Task SendSMS(SMS sms) 
{ 
    return Task.Run(() => 
    { 
     SendSMS smsSend = new SendSMS(sms.message, sms.number, 0, SmsResponseCallback); 
     Console.WriteLine("Sent a SMS to " + sms.number); 
    }); 
} 
0

如果你使用TaskCompletionSource來做到這一點,你會得到一個更具擴展性的解決方案,因爲Task.Run使用了一個線程。我沒有編譯這個,但你應該可以這樣做:

private void SendSMSs(List<SMS> smsList) 
{ 
    var messagesSent = smsList.Select (s => SendSMS(s)).ToArray(); 
    Task.WaitAll(messagesSent); 
} 

private Task<SMS_Result> SendSMS(SMS sms) 
{ 
    var tcs = new TaskCompletionSource<SMS_Result>(); 

    SendSMS smsSend = new SendSMS(sms.message, sms.number, 0, result => 
    { 
     tcs.SetResult = result; 
     Console.WriteLine("Succesfully sent a SMS to " + result.Destination + " with result: " + result.Result); 
    }); 

    Console.WriteLine("Sent a SMS to " + sms.number); 

    return tcs.Task; 
}