我使用Control.Invoke()
來顯示一個對話框。該代碼是一個處理程序,用於從用戶獲取憑證,並且可以在一個線程中執行,這就是我將該呼叫執行爲InvokeRequired/Invoke
代碼段的原因。使用invoke的ShowDialog正在使應用程序無響應
有時候,只有在某些機器中,當我關閉對話框時,應用程序變得無法保留(它不管理一些鼠標點擊,但管理其他)。如果我執行一些「允許」操作,應用程序將再次啓動。看起來處理任何事件,應用程序都會修復它自己。
您是否知道.NET框架中的任何已知錯誤,或者是否會導致此問題?
在此先感謝。
編輯:這是我使用的代碼:
public class GuiCredentialsHandler
{
// control used to invoke if needed
private static Control mInvokeControl;
// control used as parent for showDialog (could be null)
private static Control mParentControl;
/// <summary>
/// Initialize a GetCredentials handler for current process.
/// This method should be always called from the UI thread, for
/// a correctly handling for invokes (when the handler is called
/// from a thread).
/// </summary>
/// <param name="parentControl">Application top form.
/// Can be null if unknown</param>
public static void Initialize(Control parentControl)
{
if (parentControl != null)
{
mInvokeControl = parentControl;
}
else
{
mInvokeControl = new Control();
// force to create window handle
// otherwise, invoke required always
// return false
mInvokeControl.CreateControl();
}
mParentControl = parentControl;
}
public static Credentials GetCredentials(
string servername, SEIDWorkingMode serverWorkingMode)
{
if (mInvokeControl.InvokeRequired)
{
return mInvokeControl.Invoke(
new GetCredentialsDelegate(DoGetCredentials),
new object[] { servername, serverWorkingMode })
as Credentials;
}
else
{
return DoGetCredentials(servername, serverWorkingMode);
}
}
private static Credentials DoGetCredentials(
string servername, SEIDWorkingMode serverWorkingMode)
{
GetCredentialsDialog dialog = new GetCredentialsDialog();
dialog.Server = servername;
dialog.WorkingMode = serverWorkingMode;
DialogResult result = dialog.ShowDialog(mParentControl);
if (result == DialogResult.Cancel) return null;
UserInfoRetriever retriever = new UserInfoRetriever(
servername, serverWorkingMode,
dialog.UserName, dialog.Password);
SEID seid = retriever.GetCurrentUser();
return new Credentials(seid, serverWorkingMode);
}
public delegate Credentials GetCredentialsDelegate(
string serverName,
SEIDWorkingMode mode);
這不可能是它的一個bug。我會發布你的代碼。還請描述哪些操作起作用並且不起作用。 –
@Rhhound:我發佈了源代碼。謝謝。 –
@Daniel你的GetCredentials有一個嘗試沒有抓住。 – LarsTech