我编程的方式有什么不对或固有的不安全吗?我还在学习.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();
答案 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();