我需要在Web应用程序.NET中运行TWO Threads。 3.5
两种方法MakeRedCars和MakeBlueCars都需要同时运行,因为两者都需要5秒钟。我尝试过很多非常糟糕的示例代码。我不需要超过2个线程。我遇到的主要问题是知道如何等待它们完成以及如何存储每个结果。
每个方法都做不同的事情,一个是Web请求,一个是SQL调用。
两种方法都返回(汽车)列表,例如:
carList.addrange(MakeRedCars())
carList.addrange(MakeBlueCars())
for each car in carlist<br>
response.write(car.colour + "<\br>")
next
我已经实现了下面的答案,并且空对象一切运行良好,只要挂钩数据库调用,返回数据/对象工作室就会执行JIT并崩溃。
答案 0 :(得分:1)
为什么不直接使用javascript调用添加列表?我总是喜欢处理HTML代码中的异步内容,而不是直接在服务器上处理......
顺便说一下,carList
什么是下拉列表? <asp:ListBox>
试试这个:
1 - 服务器端
创建一个Generic Handler并在那里放弃你的调用,然后以某种数组返回列表,或者在那里完成所有操作,这取决于你,我个人更喜欢从我的处理程序发送JSON(我称之为我的后台工作者) )
<%@ WebHandler Language="C#" Class="GetListA" %>
using System;
using System.Web;
public class GetListA : IHttpHandler {
public void ProcessRequest (HttpContext context) {
string myType = Request["type"];
//Do your call and fill up carlist
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (var car in carlist) {
sb.AppendFormat("<option value='{0}'>{1}</option>",
car.colourId,
car.colourName);
}
context.Response.ContentType = "text/plain";
context.Response.Write(sb.ToString());
}
public bool IsReusable {
get {
return false;
}
}
}
2 - javascript调用
创建一个调用List的方法,重用该方法,让我们传递一个变量
function getListAsync(elem, param) {
$.get("myGetList.ashx", {type:param}, function(data) {
if(data.length > 0)
$("#" + elem).empty().append(data);
});
}
然后简单地致电:
$(document).ready(function() {
getListAsync("myListA", "A");
getListAsync("myListB", "B");
}
我希望从现在开始,这有助于在异步模式下完成所需的工作
答案 1 :(得分:1)
您可以在普通旧线程上使用Join
。 Join
将阻止当前线程,直到该线程完成。
技巧是能够获得它们的结果并以线程安全的方式将它们合并在一起。
Sub Main()
Dim t1 = New Thread(AddressOf MakeBlueCars)
Dim t2 = New Thread(AddressOf MakeRedCars)
t1.Start()
t2.Start()
t1.Join() 'Wait till t1 is done
t2.Join() 'Wait till t2 is done
'The field cars will contain the results here.
End Sub
Private cars As List(Of Car) = New List(Of Car)()
Sub MakeBlueCars()
Dim blueCars = New List(Of Car)()
'Populate blueCars
SyncLock cars
cars.AddRange(blueCars)
End SyncLock
End Sub
Sub MakeRedCars()
Dim redCars = New List(Of Car)()
'Populate redCars
'Merge the thread-specific list with the main list, blocking only once instead of every time a car is added.
SyncLock cars
cars.AddRange(redCars)
End SyncLock
End Sub
答案 2 :(得分:1)
您可以使用Join等待两个线程完成,并且您应该为两个线程使用两个集合而不是一个集合,因为如果不是真的需要同步这两个集合是昂贵的:
Dim redThread As New Threading.Thread(AddressOf MakeRedCars)
Dim blueThread As New Threading.Thread(AddressOf MakeBlueCars)
redThread.Start()
blueThread.Start()
redThread.Join()
blueThread.Join()
Dim carList = New List(Of String)(redCars)
carlist.AddRange(blueCars)
For Each car In carList
Response.Write(car)
Next
...
Private redCars As New List(Of String)
Private blueCars As New List(Of String)
Private Sub MakeRedCars()
For i As Int32 = 1 To 100000
redCars.Add("Car #" & i)
Next
End Sub
Private Sub MakeBlueCars()
For i As Int32 = 1 To 100000
blueCars.Add("Car #" & i)
Next
End Sub
答案 3 :(得分:0)
如果您无法访问新的任务并行库(.NET 4),我猜您使用了Te Thread类。
您可以使用Thread.Join()
方法等待线程完成。
所以你启动你的两个线程并加入它们:
Thread t1 = new Thread(func1);
Thread t2 = new Thread(func2);
List<Car> l1 = new List<Car>();
List<Car> l2 = new List<Car>();
// start them
t1.Start(l1);
t1.Start(l2);
// join them
t1.Join();
t2.Join();
// now you have your two lists populated with cars
要获得结果,您可以使用类中的某些共享字段,或者可以为线程提供状态对象。
答案 4 :(得分:0)
ThreadStart tsMakeRedCars = new ThreadStart(MakeRedCars);
Thread tMakeRedCars = new Thread(tsMakeRedCars );
tMakeRedCars .Start();
ThreadStart tsMakeBlueCars = new ThreadStart(MakeBlueCars);
Thread tMakeBlueCars = new Thread(tsMakeBlueCars );
tMakeBlueCars.Start();
tMakeRedCars.join();
tMakeBlueCars.join();
//I think this will serve, you purpose.