[ASP.NET] 簡易自建多緒減緩 Timeout 問題

話說,2010 新到公司,開始建置 WinApp 定時回傳資料到公司網站時,當時沒有資料,所以用了很簡單的機制。
1. 在 WinForm 上使用 WebClient 回傳,若沒有正常收到 Server 回應,視同回傳失敗,下次重傳。
2. 在 WebForm 檢查 WinApp 認證後,接收資料採用先刪除回傳範圍的資料,再新增,避免 WinForm 因網路失敗重傳產生重複資料。

隨著時間增加,資料已經累積到 3 千萬筆 (row) ,這就發生一個麻煩的問題,當跑 SQL DELETE 時,會非常的久,會超過 90 秒。 Web 端比較簡單,可以改成先檢查資料是否重複,沒重複就不跑 DELETE ,可是 WinForm 就麻煩了,裡面有很多資料蒐集點的網路,拒絕遠端連入,因此只能從 Web 端著手,而無法從 WinForm 更新著手。

WinForm 那邊主要問題是 WebClient 超過 90 秒沒有收到任何資訊時,會自動斷線,但只要有收到資料,就不會斷訊。所以就用簡單的偷雞方案處理。
方案 1:呼叫執行緒跑 DELETE ,目前執行緒定時輸出空白。
方案 2:呼叫執行緒定時輸出空白,目前執行緒跑 DELETE 。

由於方案 1 修改程式碼比較多,最後改用方案 2 。

方案 2 主要就是要檢查目前執行緒是否終結,此外,當發生使用者端斷線時,會有例外拋出,既然只是輸出空白沒其他用途,就直接把例外拋棄即可。

   ' 執行緒輸出空白
   ' arrParameter(0): 主執行緒
   ' arrParameter(1): 輸出空白字串的時間間距,毫秒
   ' arrParameter(2): 逾時,毫秒
   Sub ThreadResponseSpace(ByVal arrParameter As Object)
      Dim mainThread As Threading.Thread = CType(arrParameter(0), Threading.Thread)
      Dim sleepMillisecond As Integer = arrParameter(1)
      Dim timeOutTime As New TimeSpan(arrParameter(2) * 10000)
      Dim endTime As DateTime = DateTime.Now + timeOutTime
      Dim DiffTime As TimeSpan

      Try
         Do
            Threading.Thread.Sleep(sleepMillisecond)
            If DateTime.Now > endTime Then Exit Do
            Response.Write(" ")
         Loop Until (Not mainThread.IsAlive) Or (Not Response.IsClientConnected)
      Catch ex As Exception
         ' Throw New Exception(sbOutput.ToString(), ex) ' 客戶端中斷或其他出錯時,把狀態送到事件檢視器
      End Try
   End Sub

   Sub Test()
         Dim waitThread As New Threading.Thread(AddressOf ThreadResponseSpace)
         Dim sqlThread As Threading.Thread = Threading.Thread.CurrentThread

         waitThread.Start(New Object() {sqlThread, 5000, 1800000}) ' 每 5000 ms 輸出一次空白,最長不超過 1800000 ms 秒

         ' 執行很長時間的功能
         
         waitThread.Abort()
   End Sub
Categories: 工作點滴, 技術分享 | 發表留言

文章導覽

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: