我有一个表单是从另一个表单在另一个线程上启动的。大部分时间它都很完美,但我不时会得到以下错误。有人可以帮忙吗?
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
at System.Drawing.Icon.ToBitmap()
at System.Windows.Forms.ThreadExceptionDialog..ctor(Exception t)
at System.Windows.Forms.Application.ThreadContext.OnThreadException(Exception t)
at System.Windows.Forms.Control.WndProcException(Exception e)
at System.Windows.Forms.Control.ControlNativeWindow.OnThreadException(Exception e)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
答案 0 :(得分:1)
用户必须能够同时看到多个开放账户,对吧?那么你需要一个表单的多个实例吗?
除非我误读了某些内容,否则我认为你不需要这种情况的线程,我认为你只是将自己介绍给一个受伤的世界(比如这些例外)。
假设您的帐户表单名为AccountForm,我会这样做:
Dim acctForm As New AccountForm()
acctForm.Show()
(当然你会有自己的逻辑...)我甚至可以把它放在ShowForm
方法中,这样我就可以这样更新我的调用者:
ShowForm()
完成。现在所有这些假设您已经很好地封装了AccountForm,以便每个实例都有自己的数据,并且它们不会在实例之间共享任何内容。
使用线程不仅有点过分,而且可能会在顶部引入异常等错误。我在调试多线程WinForms应用程序方面的经验表明,这些错误通常很难复制,而且查找和修复非常棘手。通常,最好的解决办法是不要多线程,除非你绝对,积极地拥有。
答案 1 :(得分:0)
你能详细说明你在这里想做什么吗? 如果您尝试从与UI线程不同的线程显示表单,请参阅以下问题: My form doesn't properly display when it is launched from another thread
答案 2 :(得分:0)
该应用程序是Explorer-Type客户管理系统。帐户表单从“Main”资源管理器表单在单独的后台线程上启动。我们这样做是因为用户需要能够同时打开多个帐户。
我们使用以下代码启动表单:
Thread = New Thread(AddressOf ShowForm)
Thread.SetApartmentState(ApartmentState.STA)
Thread.IsBackground = True