2009-12-01 26 views
19

Tôi đang tạo dịch vụ web asmx và phải tạo chuỗi để làm nền IO để làm mới dữ liệu hệ thống. Cách đúng là gì? Tôi không quan tâm để có được bất kỳ kết quả nào để tạo chuỗi. Tôi chỉ muốn chuỗi công nhân ASP.NET tạo ra một luồng mà nó đang tải và cuối cùng tạo một gán (tôi nghĩ rằng gán _alldata = newData là nguyên tử trong đó cả hai cá thể của lớp cấu trúc lớn của tôi SystemData). chuỗi mới có thể truyền ngay lập tức.đúng cách để tạo chuỗi trong ứng dụng web ASP.NET

Tôi đã đọc một bài viết http://msdn.microsoft.com/fi-fi/magazine/cc164128%28en-us%29.aspx#S2 đề xuất sử dụng chuỗi không phải là chủ đề. Tuy nhiên, bài viết về kịch bản khác nhau/phức tạp hơn và không giúp tôi nhiều.

Xin cảm ơn: Matti

PS. Tôi cũng đã đặt câu hỏi này trong what is the right way to spawn thread for database IO in asmx web service? nhưng câu hỏi đó quá phức tạp với nhiều câu hỏi.

Trả lời

28

Something như thế này:

public delegate void Worker(); 
private static Thread worker; 

public static void Init(Worker work) 
{ 
    worker = new Thread(new ThreadStart(work)); 
    worker.Start(); 
} 

public static void Work() 
{ 
    // do stuff 
} 

Sau đó, có được những thứ bắt đầu bằng cách gọi Init(Work).

Nếu bạn gọi BeginInvoke() hoặc ThreadPool.QueueUserWorkItem(), nó sử dụng chuỗi chủ đề chuỗi ASP.NET, có thể ảnh hưởng đến khả năng mở rộng của ứng dụng của bạn.

Trong trường hợp hữu ích, tôi trình bày chi tiết các vấn đề này trong sách của mình, cùng với các ví dụ về mã, tiêu chuẩn mẫu, v.v. Ultra-Fast ASP.NET.

+0

Không bắt đầu một chuỗi mới có nhiều tài nguyên hơn sau đó sử dụng một chuỗi từ nhóm chủ đề không? – SirMoreno

+0

cảm ơn câu trả lời! bây giờ có vẻ như đang tranh luận với bạn và SirMoreno liệu có nên sử dụng thread thread thread hay không ... –

+1

Có, bắt đầu một chuỗi mới sử dụng nhiều tài nguyên hơn luồng threadpool. Tuy nhiên, ý tưởng không phải là để bắt đầu một chủ đề mới cho mỗi hành động. Thay vào đó, chỉ bắt đầu một (hoặc một số nhỏ) của các chủ đề của riêng bạn, và sau đó truyền WorkItems của một số loại cho chúng để thực thi. Một lần nữa, vấn đề với thread threadpool là họ sẽ làm giảm khả năng mở rộng của ứng dụng của bạn, bởi vì họ là những chủ đề tương tự được sử dụng để xử lý các trang mình. – RickNZ

4

Hãy xem tại địa chỉ:

http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspx?fid=326357&df=90&mpp=25&noise=3&sort=Position&view=Quick

Bạn có thể làm một cái gì đó như:

public delegate void MethodInvoker(); 

    private void Foo() 
    { 
     // sleep for 10 seconds. 
     Thread.Sleep(10000); 
    } 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    // create a delegate of MethodInvoker poiting to 
    // our Foo function. 
    MethodInvoker simpleDelegate = new MethodInvoker(Foo); 

    // Calling Foo Async 
    simpleDelegate.BeginInvoke(null, null); 

} 
+0

BeginInvoke() sử dụng chuỗi chủ đề thread ASP.NET. – RickNZ

+0

cảm ơn câu trả lời! bây giờ có vẻ như đang tranh luận với bạn và RickNZ liệu có nên sử dụng thread thread thread hay không ... –

+0

Nếu thread không sử dụng nhiều thời gian CPU (chờ cho bên thứ ba như DB), bạn nên sử dụng tùy chỉnh thread pool: http://stackoverflow.com/questions/1031763/net-custom-threadpool-with-separate-instances Nếu không, tôi nghĩ BeginInvoke là đúng cách. – SirMoreno

Các vấn đề liên quan