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

C# .NET线程-这是处理返回结果的两个线程的适当方法吗?,c#,.net,multithreading,C#,.net,Multithreading,我的编程方式是否有任何错误或固有的不安全之处?我还在学习.NET中的线程逻辑 基本上,我的apimager.ExecuteRequest()被调用了两次,这需要一段时间,所以我希望这两个调用同时发生。看起来dataResult变量在连接之后都被适当地填充了,但是我一直看到关于AsyncResult和所有其他与.NET并发性相关的API的事情,我认为我可能把它简化了一点 如果没有什么问题,有人能告诉我一个更好的方法来获得同样的结果吗 MyDataResult dataResult1 = null,

我的编程方式是否有任何错误或固有的不安全之处?我还在学习.NET中的线程逻辑

基本上,我的
apimager.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();
这似乎还可以。 也许您可以通过在当前线程中运行第二个请求来对此进行一些优化,而不是让三个线程中的一个线程只等待另外两个线程:

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();
这似乎还可以。 也许您可以通过在当前线程中运行第二个请求来对此进行一些优化,而不是让三个线程中的一个线程只等待另外两个线程:

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

你的方法没有问题。如果您想变得更“时髦”,可以使用一些.NET 4.0结构,如
Parallel.Invoke
,来缩短代码:

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

你的方法没有问题。如果您想变得更“时髦”,可以使用一些.NET 4.0结构,如
Parallel.Invoke
,来缩短代码:

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

你可以用


请解释下面的评论“但我一直看到有关AsyncResult和所有其他与.NET并发性相关的API的东西,我认为我可能有点过于简化了。”请解释下面的评论“但我一直在看AsyncResult和所有其他与.NET并发相关的API,我认为我可能把它简化了一点。请注意,Parallel.Invoke并不能保证它将以并行方式实际执行事情,因此如果OP总是希望以这种方式执行,那么并行就不是最好的选择+1、很酷!不幸的是,我正在工作中等待我的MSDN许可证以获取更新的VS副本,我仍然使用3.5:(不过我稍后再谈这个问题!@Andy:是的,文档中确实有这样的说法,但是如果您至少有一个双核CPU,并且您的操作需要足够长的时间,那么它们很可能会在不同的内核上并行执行。很可能!=一直以来,这就是我试图澄清的所有内容。请注意parallel.Invoke并不能保证这一点将实际并行执行,因此如果OP总是希望以这种方式执行,那么并行不是最好的方式。+1,非常酷!不幸的是,我正在工作中等待我的MSDN许可证以获得VS的更新副本,我仍然使用3.5:(不过我稍后再谈这个问题!@Andy:是的,文档中确实有这样的说法,但如果您至少有一个双核CPU,并且您的操作需要足够长的时间,那么它们很可能会在不同的内核上并行执行。最有可能的是!=一直以来,我都在试图弄清楚这一点。