[.net] ASP.NET 두 스레드, 하나의 결과
자바 스크립트 호출을 직접 사용하여 목록을 추가하지 않는 이유는 무엇입니까? 나는 항상 서버에서 직접보다는 HTML 코드에서 비동기 작업을 처리하는 것을 선호합니다.
BTW, carList
드롭 다운이란 무엇 입니까?<asp:ListBox>
이 시도:
1-서버 측
Generic Handler를 만들고 거기에 호출을 놓은 다음 목록을 일종의 배열로 반환하거나 거기에서 모두 수행하십시오. 개인적으로는 Handlers에서 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-자바 스크립트 호출
목록을 호출하는 메서드를 만들고 메서드를 다시 사용하기 위해 변수를 전달하겠습니다.
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");
}
이제부터 비동기 모드에서 필요한 작업을 수행하는 데 도움이되기를 바랍니다.
-------------------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
-------------------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
-------------------새로운 Task Parallel Library (.NET 4)에 대한 액세스 권한이 없으면 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
결과를 얻으려면 클래스에서 공유 필드를 사용하거나 스레드에 상태 개체를 제공 할 수 있습니다.
-------------------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.
출처
https://stackoverflow.com/questions/7415975