在我的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;
}
提前致谢。
答案 0 :(得分:1)
您的代码是在服务器端执行的,这就是您因超时响应而停滞的原因。您的主线程等待(objThread.Join)在服务器上打开的对话框的响应,因为您无法在客户端看到它从未得到响应。
如果要在客户端打开对话框文件,可以采用与ActiveX对象类似的方式执行此操作。
你可以在以下地址找到msdn教程,但它只适用于IE:
http://msdn.microsoft.com/fr-fr/magazine/cc301932(en-us).aspx
答案 1 :(得分:0)
如果我正确理解你的问题,答案很简单:你做不到。
Windows窗体控件在浏览器中不起作用。它适用于您的计算机,因为浏览器窗口是本地的,因此线程可以附加到它并将其用作父级。
IIS进程没有窗口,只提供文本,图像和视频文件。你本质上是要求在其他地方的服务器机房的某台机器上运行的IIS线程连接到别人机器上的浏览器窗口,然后开始在其上显示Windows Forms控件。
如果他们在Linux机箱或Mac上怎么办?
创建ASP.NET是为了解决为IIS创建交互式表单的问题。
希望这有帮助。