0

一个菜鸟线程问题...我希望通过一个新线程调用 sendSMS 过程,但面临无法传递参数的问题。没有使用跟踪 user1Mobile 和 messageContents 值的全局变量,基本的解决这个问题时的技术?我读过几篇文章,但我相信它们是矫枉过正的。

通常我会通过以下方式启动:

ThreadStart job = new ThreadStart(speakTextNewThread);
            Thread thread = new Thread(sendSMS);
            thread.Start();

现在从我的应用程序中的任何地方调用以及我希望使其成为线程:

sendSMS(Settings1.Default.user1Mobile, messageContents)

发送过程:

private string sendSMS(string phoneNumber, string messageToSend)
    {
        try
        {
            API api = new API(Settings1.Default.clockworkAPIKey);

            SMS sms = new SMS
            {
                To = phoneNumber,
                Message = messageToSend
            };

            SMSResult result = api.Send(sms);

            if (result.Success)
                return "Sent\nID: " + result.ID;                
            else
                return "Error: " + result.ErrorMessage;
        }
        catch (APIException ex)
        {
            // You'll get an API exception for errors 
            // such as wrong key
            return "API Exception: " + ex.Message;
        }
}

谢谢

4

4 回答 4

1

我认为最简单的方法是:

new Thread(() => sendSMS(Settings1.Default.user1Mobile, messageContents)).Start();

或者

Task.Factory.StartNew(()=>Settings1.Default.user1Mobile, messageContents));
于 2012-12-05T12:49:54.030 回答
0

使用BackgroundWorker. 基本上这意味着你启动另一个线程并用你的代码和参数提供它;后台工作人员将在自己的线程上完成工作,并在完成时通知主线程。

这是一个很好的教程: http: //www.dotnetperls.com/backgroundworker

于 2012-12-05T12:48:41.243 回答
0

请参阅下文以启动您自己的线程:

string retMsg
var t = new Thread(() => retMsg = sendSMS(Settings1.Default.user1Mobile, messageContents));
t.Start();

如果你想对返回值做点什么,我添加了 retMsg

于 2012-12-05T12:50:23.100 回答
0

你需要这样的东西。当您传递多个参数时,您需要一个委托()。

Thread thread = new Thread(delegate()
{
    sendSMS(phoneNumber,message);
});
thread.Start();

您还需要将参数作为对象传递,并在您的方法捕获后转换为字符串:-

private string sendSMS(object phoneNumber, object messageToSend)
{
  string pnumber = (string)phoneNumber;
  string msg = (string)messageToSend;

   // DO REST OF WORK HERE.
}
于 2012-12-05T12:57:59.330 回答