2013-08-01 27 views
0

我正在使用与C#结合的php脚本将文件从Windows中的文件夹上载到Web服务器目录中。它的工作原理,但是,当上传开始时,应用程序冻结。使用php上传文件 - 冻结

private void submitExam_Click(object sender, EventArgs e) 
{ 
    // loop through and upload our sound bits 
    string[] files = System.IO.Directory.GetFiles(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + "\\wav", "*.wav", System.IO.SearchOption.AllDirectories); 
    foreach (string soundBit in files) 
    { 
     System.Net.WebClient Client = new System.Net.WebClient(); 
     Client.Headers.Add("Content-Type", "audio/mpeg"); 
     byte[] result = Client.UploadFile("http://website.com/uploadFiles.php", "POST", soundBit); 
    } 

    processing f2 = new processing(); 
    f2.MdiParent = this.ParentForm; 
    f2.StartPosition = FormStartPosition.CenterScreen; 
    f2.Show(); 
    this.Hide(); 
} 

在C#应用程序,点击提交按钮时,上载开始,它显示了显示一条消息说文件正在上传新的表单页面。我遇到的问题是,当按下提交按钮时,processing表单不会显示约10秒钟左右,直到上传完成或接近完成。

有没有什么方法可以显示处理页面,同时上传文件而不会冻结应用程序?

+0

试试这个控制:http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/AsyncFileUpload/AsyncFileUpload.aspx编辑:你在做什么基本上寻找是一种上传文件的异步方式,然后通知它已完成上传。有很多方法可以做到,只需搜索“asp.net异步文件上传” –

+0

@JesseSmith,感谢您的建议,但是,我没有使用ASP,而是一个桌面应用程序。 – Spencer

+0

啊!授予@Ralph说,这个问题是由阻塞UI线程引起的 - 最终结果仍然是某种形式的异步 –

回答

3

应用程序冻结,因为您的上传操作阻止了主UI线程,需要始终保持其运行循环为始终运行的状态。

您还需要确保在上载操作完成时更新主线程上的UI。

主线程有时也称为UI线程是您的Windows窗体应用程序使用处理用户输入,响应事件,更新UI控件线程等

冻结行为是因为你的上传操作需要大约10秒钟才能完全上传文件,因此在完成此过程之前,您的应用程序无法响应。如果上传需要20分钟,您的应用程序将冻结20分钟。

看到这个职位有关如何避免此问题的详细信息:Doing series of actions without blocking UI Thread

+0

太棒了!我真的不知道这存在。添加它,它的工作原理应该如此。非常感谢您的分享。 – Spencer

+0

@Spencer不用客气,请考虑将我的答案标记为“已回答”。 –

+0

我当然会 - 我必须再等3分钟才能接受它。干杯! – Spencer