2014-02-26 129 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; 
}