0

私は別の壁にぶつかった。マルチスレッドとSMTPに関する以前の質問をここで確認してください

とにかく、実行時に動的にスレッドを作成してStart()メソッドを呼び出そうとしていますが、KeyNotFoundExceptionを受け取っています。これについての洞察をいただければ幸いです。私のコードがここから大きく外れている場合、基本的に私が達成したいのは、ユーザー入力(カウント)に従って個々のスレッドで実行される一意のSMTPインスタンスを作成し、各スレッドを同時に実行することです。

//count is user input (number of messages)  

int instanceCount = 0;

        var vartable = new Dictionary<string, SmtpClient>();
        var vartable2 = new Dictionary<string, Thread>();

        for (int i = 0; i < count; ++i)
        {
            vartable[instanceCount.ToString()] = new SmtpClient
            {
                Host = txtBxSenderHost.Text,
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
            };

            vartable2[instanceCount.ToString()] = new Thread(delegate()
            {
                using (var message = new MailMessage(senderAdrress, toAddress)
                {
                    Subject = strSubject,
                    Body = strBody
                })

                {
                    {
                        ((SmtpClient)vartable[instanceCount.ToString()]).Send(message);
                    }
                }
            });

            instanceCount++;
        }

そして、念のために、私は「0」を使用して動作するかどうかを確認しました

        vartable2["0"].Start();
4

1 に答える 1

2

デリゲート内にループ変数を格納する場合は、反復の最後の値を受け取ることを避けるために、デリゲートの外側で別の変数を宣言する必要があります。

print ステートメントを作成すると、count の値が何であれ、各スレッドがアクセスしようとしている値が同じになることがわかります。デリゲート ステートメントの上に変数を追加するだけです。

        int tempInstanceCount = instanceCount;
        vartable2[instanceCount.ToString()] = new Thread(delegate()
        {
            using (var message = new MailMessage(senderAdrress, toAddress)
            {
                Subject = strSubject,
                Body = strBody
            })

            {
                {
                    ((SmtpClient)vartable[tempInstanceCount.ToString()]).Send(message);
                }
            }
        });
于 2013-01-25T22:23:41.257 に答える