我有以下功能:
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函数确实需要等待芬兰语的任务。它必须尽快返回,然后短信将在他们自己的时间发送?
那么我怎样才能创建一个直接开始的任务,然后我就可以继续创建下一个任务。
答案 0 :(得分: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
System.Threading.Tasks
做同样的工作
foreach(SMS sms in smsList)
{
var t = Task.Factory.StartNew(new Action(SendOneSMS(sms)));
}
答案 1 :(得分:0)
如果发送SMS的函数没有异步备选,您可以使用TPL启动最终阻止线程发送SMS的任务:
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);
});
}
答案 2 :(得分: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;
}