1

私がこれをプログラムした方法について、何か間違っている、または本質的に安全ではないことはありますか? 私はまだ .NET のスレッド ロジックを学んでいます。

基本的にAPIManager.ExecuteRequest()2回電話がかかってきて時間がかかるので、2回同時に電話がかかるようにしたかったのです。結合後に dataResult 変数が両方とも適切に設定されているように見えますが、AsyncResult.NET の同時実行に関連する他のすべての API について見続けており、おそらくこれを少し単純化しすぎているのではないかと思いました。

何も問題がなければ、誰かが同じ結果を得るためのより良い方法を教えてもらえますか?

MyDataResult dataResult1 = null, dataResult2 = null;

System.Threading.Thread t1 = new System.Threading.Thread(delegate()
    {
        dataResult1 = APIManager.ExecuteRequest(dataRequest1, TBIdentifiers.Text, TBCommands.Lines);
    });

System.Threading.Thread t2 = new System.Threading.Thread(delegate()
    {
        dataResult2 = APIManager.ExecuteRequest(dataRequest2, TBIdentifiers.Text, TBCommands.Lines);
    });

    t1.Start();
    t2.Start();

    t1.Join();
    t2.Join();
4

3 に答える 3

3

これは問題ないようです。1 つが他の 2 つだけを待っている 3 つのスレッドを持つ代わりに、現在のスレッドで 2 番目の要求を実行することで、これを少し最適化できるかもしれません。

System.Threading.Thread t1 = new System.Threading.Thread(() =>dataResult1 = APIManager.ExecuteRequest(dataRequest1, TBIdentifiers.Text, TBCommands.Lines));

t1.Start();
dataResult2 = APIManager.ExecuteRequest(dataRequest2, TBIdentifiers.Text, TBCommands.Lines);
t1.Join();
于 2012-07-02T13:05:54.447 に答える
2

あなたのアプローチに問題はありません。もっと「ヒップ」になりたい場合は、.NET 4.0 コンストラクトを使用Parallel.Invokeして、コードを短くすることができます。

Parallel.Invoke(
    () => dataResult1 = APIManager.ExecuteRequest(dataRequest1, TBIdentifiers.Text, TBCommands.Lines),
    () => dataResult2 = APIManager.ExecuteRequest(dataRequest2, TBIdentifiers.Text, TBCommands.Lines)
    );
于 2012-07-02T13:24:57.290 に答える
1

ParameterizedThreadStart デリゲートを使用できます

public class Request
{
    public Request() {

    public MyDataResult DataResult { get; set; }
    public MyDataRequest DataRequest { get; set; }
}
MyDataResult dataResult1 = null, dataResult2 = null;

public static void ExecuteRequest(object data)
{
    Request req = (Request)data;
    req.DataResult = APIManager.ExecuteRequest(req.DataRequest, 
                                      TBIdentifiers.Text, TBCommands.Lines) 
}

System.Threading.Thread t1 = new System.Threading.Thread(ExecuteRequest);
System.Threading.Thread t2 = new System.Threading.Thread(ExecuteRequest);

t1.Start(new Request{DataResult = dataResult1, DataRequest = dataRequest1});
t2.Start(new Request{DataResult = dataResult2, DataRequest = dataRequest2});

t1.Join();
t2.Join();
于 2012-07-02T13:27:15.467 に答える