.NET线程 - 这是处理返回结果的两个线程的合适方法吗?

时间:2012-07-02 13:00:12

标签: c# .net multithreading

我编程的方式有什么不对或固有的不安全吗?我还在学习.NET中的线程逻辑。

基本上,我有两次调用APIManager.ExecuteRequest(),需要一段时间,所以我希望这两个调用同时发生。看起来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();

3 个答案:

答案 0 :(得分:3)

这似乎没问题。 也许你可以通过在当前线程中运行第二个请求来优化这一点,而不是有3个线程,其中一个只等待另外两个:

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();

答案 1 :(得分:2)

你的方法没有错。也许如果你想要更“谦逊”,你可以使用一些.NET 4.0结构,比如Parallel.Invoke来缩短你的代码:

Parallel.Invoke(
    () => dataResult1 = APIManager.ExecuteRequest(dataRequest1, TBIdentifiers.Text, TBCommands.Lines),
    () => dataResult2 = APIManager.ExecuteRequest(dataRequest2, TBIdentifiers.Text, TBCommands.Lines)
    );

答案 2 :(得分:1)

您可以使用ParameterizedThreadStart Delegate

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();