1

在我的 asp.net 应用程序中,我使用 windows forms.dll 通过创建线程来使用某些 windows 控件。这在我的系统中运行良好,但在 IIS 上托管时会出现会话超时。创建线程使我在 IIS 上的会话超时。如何创建可以在 IIS 上正常工作的线程?

下面是 iam 创建线程的代码。

public string[] DisplayFileDialog()
    {
        string[] result = null;

        try
        {
            Thread objThread = new Thread(state =>{
                result = FnOpenFileDialog();
                // TODO: do something with the returned result
            });

            objThread.IsBackground = false;
            objThread.SetApartmentState(ApartmentState.STA);
            objThread.Start();
            objThread.Join();
            return result;

        }
        catch (Exception ex)
        {


            return result;
        }

 protected string[] FnOpenFileDialog()
    {
        IntPtr hdlr = GetForegroundWindow();

        WindowWrapper Mockwindow = new WindowWrapper(hdlr);

        OpenFileDialog fDialog = new OpenFileDialog();

        fDialog.Title = "Select Files";

        fDialog.Multiselect = true;
        fDialog.CheckFileExists = true;
        fDialog.CheckPathExists = true;

        System.Windows.Forms.DialogResult dr = fDialog.ShowDialog(Mockwindow);
        string[] filenames = fDialog.FileNames;
        return filenames;
    }

提前致谢。

4

2 回答 2

1

您的代码在服务器端执行,这就是您因超时响应而停滞不前的原因。您的主线程等待(objThread.Join)在服务器上打开一个对话框的响应,因为您在客户端看不到它,您永远不会得到响应。

如果您想在客户端打开对话框文件,您可以采用与 ActiveX 对象类似的方式进行操作。

您可以在以下地址找到有关如何执行此操作的 msdn 教程,但它仅适用于 IE:

http://msdn.microsoft.com/fr-fr/magazine/cc301932(en-us).aspx

于 2012-10-04T14:00:49.097 回答
0

如果我正确理解你的问题,答案很简单:你不能那样做。

Windows 窗体控件在浏览器中不起作用。它可以在您的计算机上运行,​​因为浏览器窗口是本地的,因此线程可以附加到它并将其用作父级。

IIS 进程没有窗口,它只提供文本、图像和视频文件。您实际上是在要求一个 IIS 线程在其他地方的服务器机房中的某台机器上运行,以连接到其他人机器上的浏览器窗口,然后开始在其上显示 Windows 窗体控件。

如果它们在 Linux 机器或 Mac 上怎么办?

创建 ASP.NET 是为了解决为 IIS 创建交互式表单的问题。

希望这可以帮助。

于 2012-10-04T13:52:50.707 回答