将函数转换为异步任务

时间:2014-02-26 12:25:12

标签: c# multithreading asynchronous task-parallel-library

我有以下功能:

 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 个答案:

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