2015-12-14 92 views
1

我正在處理一個正在導入客戶端的CSV文件。 該CSV應該包含一些信息,這些信息將用於在我公司的數據庫的某個表中執行更新。我的C#函數處理文件,查找錯誤,如果沒有發現錯誤,它會發送一堆更新命令(文件通常從50到100000行不等)。 到現在爲止,我在同一個線程中執行更新(逐行執行更新),但取決於文件,它會變慢一點,所以我選擇將所有SQL發送到Azure SQL隊列(這是一種獲取大量「消息」並再次運行數據庫的SQL代碼的服務),因此,客戶端不必等待執行的操作。 它得到了一些快,但仍然需要很長時間(由於對Azure SQL隊列的請求)。所以我注意到將該操作放在單獨的線程中並將所有SQL發送到我的Azure SQL隊列。在單獨的線程中執行長操作是否安全?

雖然我有點擔心。在單獨的線程中執行長操作真的很安全嗎?它可靠嗎?

+0

定義「安全」。您將需要處理處理/報告錯誤,因爲您不能只返回一個數字或錯誤字符串。 –

+0

您熟悉如何在Sql Server上創建臨時表,那麼您可以創建一個可以同時處理所有行的XML批量插入。我現在通過將csv文件轉換爲數據表格,然後將數據上載到數據表中並進行錯誤檢查等操作完成。然後我寫了自己的函數將數據錶轉換爲XML,然後將單個調用轉換爲存儲過程我通過xml和臨時表將大容量插入到單個表中 – MethodMan

+0

使用線程幾乎是不安全的。野獸的性質。但是,如果它是一個簡單的數據庫更新,那很可能不會導致任何問題。如果您可以使用異步操作(以及數據庫提供者,您可能可以),我會走這條路,因爲我認爲您可以更安全地實現用戶響應的目標。 –

回答

1

第二個線程與您以前使用的主線程一樣100%。我希望我有一些權威的答案,但這是一個普遍的做法,人們不再寫這些...

所以,是的,卸載工作到第二個線程是安全的,可以考慮通過大多數建議的方式去通過它。

編輯1
好吧,如果你的線程運行在IIS上,你需要註冊,或一旦請求/效應初探週期完成,它會殺死它,它會因爲死...

+0

如果他正在開發一個IIS應用程序,那麼你的語句不能包含true。你不用IIS註冊線程,你的AppDomain可能會在線程完成工作之前關閉。 –

+0

@ScottChamberlain是的,但在這個特定的情況下,他在第一句話中表示,行動發生在客戶端...所以我相信,鑑於問題的性質,我不認爲這是案件...但罰款,不好更新我的回答 – Leonardo

+1

爲了完成更新,註冊線程最簡單的方法是使用[HostingEnvironment.QueueBackgroundWorkItem](http://blogs.msdn.com/b/webdev/archive/ 2014/06/04/queuebackgroundworkitem-to-reliable-schedule-and-run-long-background-process-in-asp-net.aspx)啓動線程(儘管如此,它仍然無法完成,但你會得到一個CancellationToken,當你有90秒的時間完成你的工作或優雅地取消你的工作時,你可以看到它。 –

相關問題