English 中文(简体)
方法将从一个线索调用两次以上。 如何等待
原标题:Method will be called more than twice from one thread. How to wait

C#- 方法在事件上升后正在呼叫主线。 然后另一个事件在第一个事件期间使用同样的方法。 在调试时, 我从调用堆叠的两行中看到同一线上的相同方法 。 @ info: whatsthis

我怎么能阻止第二个事件等待到第一个事件以同样方法准备就绪 。 我正尝试锁定 (), 但是它不会堵住相同的线索 。 Auto ResetEvent 可以等待, 但将会等待相同的线索 。

有人有线索吗?

最佳回答

您的问题是由 Application.DoEvents () 造成。 此方法确实有其用途, 但很危险, 您偶然发现其中的原因之一 : 重新加入事件 。

所以,试试

  1. remove and avoid DoEvents().
  2. or make all your eventhandlers capable of or resistant to re-entrancy. Take a critical look at what scenarios are possible with the close button for instance. A simple trick could be:
private bool busy = false;    
private void MyHandler(sender s, EventArgs e)
{
  if (busy)
    return;   // giving up, no queuing

  busy = true;
  // code
  busy = false;  // maybe in a finally clause
}
问题回答

您可以用 < a href=> "" http://msdn.microsoft.com/ en- us/library/ system.runtime.compilerservices.methodimplattate.aspx" rel = "nofollow" @em > MethodImplAttrapte 属性标记该方法 。

Example:

[MethodImpl(MethodImplOptions.Synchronized)]
void Method()
{
   ....
}

Documentation (MSDN):

methodImplops. 同步

指定该方法可以一次只用一条线索执行。静态方法锁定类型,而实例方法锁定实例。在任何一个实例函数中,只有一条线索可以执行,而在任何一个类静态函数中,只有一条线索可以执行。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签