1

我的编程方式有什么错误或本质上不安全吗?我仍在学习.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();
4

3 回答 3

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();
于 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 回答