我正试图在C#中打开一个OpenFileDialog(在asp.net页面上的codeehind)。由于常规引用和system.windows.form引用有一些冲突,我不得不在线程中使用OpenFileDialog框,如下所示:
protected void Button1_Click(object sender, EventArgs e)
{
Thread newThread = new Thread(new ThreadStart(BrowseForFile));
newThread.SetApartmentState(ApartmentState.STA);
newThread.Start();
}
static void BrowseForFile()
{
System.Windows.Forms.OpenFileDialog MyFile = new System.Windows.Forms.OpenFileDialog();
if (MyFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
}
}
页面的工作方式意味着它必须在C#中——使用asp.net的文件上传是不起作用的。
现在,OpenFileDialog看起来很好,我可以从中获取值,但理想情况下,我需要将值传递到线程(BrowseForFile)中,并让它与页面上的其他控件一起工作,以便进行设置。不过,我对使用线程还很陌生。
有人能告诉我,基本上,如何从按钮_点击到BrowseForFile中获取整数,以及如何从BrowseForFile在页面上设置标签吗?
如果使用现代版本的.net,则可以使用异步等待。这使您更容易与对话框进行通信,并将数据传递给执行后台工作的线程。
能够使用异步等待:
- 声明您的函数async
- 让函数返回Task而不是void,并返回Task
<TResult
>而不是TResult。- 有一个例外:事件处理程序可能返回void
- 在异步函数中,使用Task.Run启动其他线程
- 当另一个线程正在运行时,您可以做其他事情
- 如果您需要结果:call await Task
在您的情况下,您必须将线程类更改为包含线程类中代码的过程。此过程可以属于任何类别。它必须声明为async并返回Task而不是void:
当然,您必须将线程类更改为异步过程:
private async Task MyThreadProcedureAsync(string fileName)
{
// do something really slow with fileName and return void
}
protected async void Button1_Click(object sender, EventArgs e)
{
string fileName = this.BrowseForFile();
if (!String.IsNullOrEmpty(fileName))
{
var myTask = Task.Run( () => MyThreadProcedureAsync(fileName))
// if desired do other things.
// before returning make sure the task is ready:
await myTask;
// during this wait the UI keeps responsive
}
}
private string BrowseForFileName()
{
using (var dlg = new System.Windows.Forms.OpenFileDialog())
{
// if needed set some properties; show the dialog:
var dlgResult = dlg.ShowDialog(this);
if (dlgResult == System.Windows.Forms.DialogResult.OK)
{
return dlg.FileName;
}
else
{
return null;
}
}
}