2012-05-01 60 views
14

Tôi chỉ có một trang web vb.net đơn giản cần gọi một Phụ thực hiện tác vụ rất dài hoạt động với đồng bộ hóa một số thư mục trong hệ thống tệp (chi tiết không quan trọng).Cách thực hiện một cuộc gọi phương thức không đồng bộ rất đơn giản trong vb.net

Khi tôi gọi phương thức, cuối cùng nó sẽ hết thời gian chờ trên trang web đang chờ hoàn thành thủ tục phụ. Tuy nhiên, mặc dù trang web hết thời gian, thói quen cuối cùng cũng hoàn thành nhiệm vụ của nó và tất cả các thư mục kết thúc như họ cần.

Tôi muốn chỉ ngăn thời gian chờ vì vậy tôi muốn gọi Sub không đồng bộ. Tôi không cần (hoặc thậm chí muốn) và gọi lại/xác nhận rằng nó đã chạy thành công.

Vì vậy, làm cách nào tôi có thể gọi phương thức của mình không đồng bộ bên trong trang web bằng VB.net?

Nếu bạn cần một số mã:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Call DoAsyncWork() 
End Sub 

Protected Sub DoAsyncWork() 
     Dim ID As String = ParentAccountID 
     Dim ParentDirectory As String = ConfigurationManager.AppSettings("AcctDataDirectory") 
     Dim account As New Account() 
     Dim accts As IEnumerable(Of Account) = account.GetAccounts(ID) 

     For Each f As String In My.Computer.FileSystem.GetFiles(ParentDirectory) 
      If f.EndsWith(".txt") Then 
       Dim LastSlashIndex As Integer = f.LastIndexOf("\") 
       Dim newFilePath As String = f.Insert(LastSlashIndex, "\Templates") 
       My.Computer.FileSystem.CopyFile(f, newFilePath) 
      End If 
     Next 

     For Each acct As Account In accts 
      If acct.ID <> ID Then 
       Dim ChildDirectory As String = ConfigurationManager.AppSettings("AcctDataDirectory") & acct.ID 
       If My.Computer.FileSystem.DirectoryExists(ChildDirectory) = False Then 
        IO.Directory.CreateDirectory(ChildDirectory) 
       End If 
       My.Computer.FileSystem.DeleteDirectory(ChildDirectory, FileIO.DeleteDirectoryOption.DeleteAllContents) 
       My.Computer.FileSystem.CopyDirectory(ParentDirectory, ChildDirectory, True) 
      Else 
      End If 
     Next 
End Sub 

Trả lời

20

Tôi sẽ không khuyên bạn sử dụng lớp học Thread trừ khi bạn cần kiểm soát nhiều hơn đối với chuỗi, vì việc tạo và rách luồng chỉ tốn kém. Thay vào đó, tôi khuyên bạn nên sử dụng a ThreadPool thread. See this để đọc tốt.

Bạn có thể thực hiện phương pháp của bạn trên một sợi ThreadPool như thế này:

System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork) 

Bạn cũng sẽ cần phải thay đổi phương pháp chữ ký của bạn để ...

Protected Sub DoAsyncWork(state As Object) 'even if you don't use the state object 

Cuối cùng, cũng cần lưu ý rằng unhandled ngoại lệ trong các chủ đề khác sẽ giết IIS. Xem this article (cũ nhưng vẫn có liên quan; không chắc chắn về các giải pháp mặc dù kể từ khi tôi không reaslly sử dụng ASP.NET).

+0

TÌNH YÊU CNTT !!! Cảm ơn! – EdenMachine

+0

Điều này rất hữu ích đối với tôi, tôi tải tệp lên máy chủ web.Xác thực tệp rồi gửi email. Ngay cả khi người dùng đóng trang web/trang web/trình duyệt, email vẫn làm cho nó đến đích của nó. – htm11h

7

Bạn có thể làm điều này với một sợi đơn giản:

Add:

Imports System.Threading 

Và bất cứ nơi nào bạn muốn nó chạy:

Dim t As New Thread(New ThreadStart(AddressOf DoAsyncWork)) 
t.Priority = Threading.ThreadPriority.Normal 
t.Start() 

Cuộc gọi đến t.Start() trả về ngay lập tức và luồng mới chạy DoAsyncWork ở chế độ nền cho đến khi hoàn thành. Bạn sẽ phải chắc chắn rằng tất cả mọi thứ trong cuộc gọi đó là an toàn thread nhưng thoạt nhìn nó thường có vẻ như vậy.

+0

hoàn hảo đã trả lời như vậy 1 nhưng tôi thích ý tưởng ThreadPool tốt hơn để giữ cho nó đơn giản và nhẹ – EdenMachine

+0

@EdenMachine Tôi đồng ý, threadpool có lẽ là cách tốt hơn để đi. –

0

Tôi cũng đang tìm kiếm thông tin về lập trình không đồng bộ trong VB. Ngoài chủ đề này, tôi cũng tìm thấy những điều sau đây: bắt đầu với Visual Studio 2012 và .Net Framework 4.5, VB đã được đưa ra hai từ khóa mới để thực hiện một phương thức không đồng bộ ngay trong khai báo, mà không sử dụng Thread hoặc Threadpool. Các từ khóa mới là "Async" và "Await". Bạn có thể tham khảo các liên kết sau đây nếu bạn muốn:

http://msdn.microsoft.com/library/hh191443%28vs.110%29.aspx

https://msdn.microsoft.com/en-us/library/hh191564%28v=vs.110%29.aspx

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