2010-01-18 66 views
0

我想通過調用使用多線程調用webservice的函數以塊形式發送文件。使用多線程發送文件塊

以下是代碼的簡單:

int chunkSize = "whatever in byte"; 
byte[] fileBytes = ConvFileToByte("the pathe of the file"); 
int numberOfParts = (int)Math.Ceiling((decimal)fileSize/chunkSize); 
for (int i; i< numberOfParts; i++) 
{ 
    //Get the offset. 
    //Get the bytes to send. 

    SendFile(ByteToSend, offset) // This call a method in a webservice. 
} 

什麼是使用這個功能mutithreading的最佳方式?

注意:但不要忘記,如果一個塊發送失敗,我應該再次發送它。

+0

你可以將它們發送出去嗎?你需要使用相同的TCP/IP連接發送它們,還是可以將它們作爲多個連接發送? – 2010-01-18 09:18:08

+4

爲此使用多線程的目的是什麼?發送文件是一個I/O限制任務,不受CPU限制,因此並行化CPU工作不可能爲您帶來任何收益。 – Wyzard 2010-01-18 09:23:42

+0

我不使用TCP/IP,我在Web服務中調用一個函數 – Hiyasat 2010-01-18 09:26:50

回答

1

除非在某種負載平衡下您的webservice有多個實例,並且您的上傳帶寬高於每個單個服務主機的下載能力,否則如果您希望實現更高的上傳速度,多線程處理呼叫是沒有意義的。另一方面,如果要上傳的文件非常大,並且您想限制用於緩衝文件的內存量,則分塊是有意義的。如果這是你的情況,並且你可以控制web服務的實現,你應該考慮使用WCF chunking而不是編寫你自己的分塊機制。

1

如果您的Web服務可以安全地接收大塊,請考慮使用ThreadPool類(請參閱這裏的一個出色示例:VB.Net Threading)。您將能夠設置並行線程的數量等。

重新發送可以在上傳單個塊的函數內完成。比方說,如果請求失敗(沒有得到服務器的「200」響應),你可以重新開始(必須重新計算重試次數,否則可能出現ifinite循環)。