2013-09-05 4 views
5

Недавно я наткнулся на собственную библиотеку третьей стороны и есть способ вести себя таким образом:Блокировка вызовов, но не блокирует нить

public Point ClickOnDrawMat(DrawMat drwmat) 
{ 
    Point pt; 
    //waiting user mouse click on DrawMat and assign to pt 
    return pt; 
} 

Когда мой код, вызывающий этот метод из основного потока, он будет блокировать по этому методу, пока пользователь не нажмет, затем верните точку с ClickOnDrawMat.

public void button1_Click(object sender, EventArgs e) 
{ 
    Point userClickedPoint = ClickOnDrawMat(oDrwMat); //Wait until user clicked 
    //Do stuff with point we got 
} 

Однако он не блокирует основную резьбу. Я все еще могу нажать другую кнопку/UI, пока он все еще ждет щелчка пользователя.
Я заметил, что при ожидании щелчка пользователя одно из основных преимуществ процессора кажется довольно высоким (~ 75%).

И это пример стека вызовов после того, как нажать на другую кнопку, пока она все еще ждет нажатия пользователя:

myProgram.frmMain.button2_Click(xxx) Line 23 
[External Code] 
ThirdPartyLib.ClickOnDrawMat(xxx) Line 16 
myProgram.frmMain.button1_Click(xxx) Line 14 

Я интересно, как это может быть сделано?
Заранее благодарим!

+2

Что такое библиотека? – Servy

+0

Halcon, проприетарная библиотека для компьютерного зрения. – user1755712

ответ

7

Мы не можем точно сказать, как это делается, если у кого-то не была копия библиотеки, и они используют декомплекс, чтобы увидеть, что делает код (если вы хотите сделать это самостоятельно dotPeek является бесплатным и простым в использовании).

Однако, как вы описываете его поведение, вероятно, многократно называет Application.DoEvents() внутри функции, это позволит обрабатывать другие сообщения, в то время как длительный процесс делает это.

Это почти никогда хорошая практика для кодирования избирательных операций из-за его высокой стоимости процессора, как вы заметили, я не рекомендую делать это в своем коде.

«Правильный» способ справиться с этим использовать один из Asynchronous Programming Patterns: async/await feature добавлен в .NET 4.5 или как NuGet package for 4.0 (TAP), есть библиотека поднять событие своей собственной (EAP), или иметь функция выполняет функцию обратного вызова, когда она завершена (APM). Внутри самой функции он должен использовать внутреннюю систему, управляемую событиями, чтобы она не использовала мощность ЦП, пока она ожидает события, а не опроса.

+0

Из-за того, что OP говорит о активности процессора, этот ответ звучит хорошо. –

+0

Спасибо! Это объясняет странную магию! Также спасибо за предложение dotPeek и Async/Await! Могу ли я спросить, есть ли способ использовать функцию async/await в .NET 3.5? – user1755712

+1

Нет, но я добавил еще несколько ссылок, которые показывают некоторые другие параметры, кроме async/wait. –

Смежные вопросы