返回/设置线程中的值



我正试图在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;
        }
    }
}

最新更新