[ANN] Generic InvocationHelper
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 29.09.06 03:48
Оценка: 9 (1)
Generic InvocationHelper

A generic class for providing thread-safe invocation of delegates. Can be used for (but not limited to) updating GUI elements from another thread.

- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: [ANN] Generic InvocationHelper
От: _FRED_ Черногория
Дата: 29.09.06 06:31
Оценка: 37 (2) +1
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Generic InvocationHelper


SDB>A generic class for providing thread-safe invocation of delegates. Can be used for (but not limited to) updating GUI elements from another thread.


Как минимум, тип T должен быть не параметром класса, а метода. Тогда его можно было бы указывать не два раза
InvocationHelper<EventHandler>.Invoke(
  new EventHandler(delegate {
    outputTextBox.Text = serialPort.ReadExisting();
  })
);

а один
InvocationHelper.Invoke(new EventHandler(delegate {
    outputTextBox.Text = serialPort.ReadExisting(); 
}));

или
InvocationHelper.Invoke<EventHandler>(delegate {
    outputTextBox.Text = serialPort.ReadExisting(); 
});
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[2]: [ANN] Generic InvocationHelper
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 29.09.06 06:35
Оценка: :)
Здравствуйте, _FRED_, Вы писали:

_FR>Как минимум, тип T должен быть не параметром класса, а метода. Тогда его можно было бы указывать не два раза


Так, Слава, глядишь — и я под твоим руководствои Шарп начну осваивать помаленьку. А хочешь, я тебе взамен что-нибудь про WTL/MFC буду рассказывать?
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: [ANN] Generic InvocationHelper
От: _FRED_ Черногория
Дата: 29.09.06 06:47
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Так, Слава, глядишь — и я под твоим руководствои Шарп начну осваивать помаленьку. А хочешь, я тебе взамен что-нибудь про WTL/MFC буду рассказывать?


Конечно, хочу
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re: [ANN] Generic InvocationHelper
От: TK Лес кывт.рф
Дата: 29.09.06 08:24
Оценка: +3
Hello, "SchweinDeBurg"
> Generic <br />
<span class='lineQuote level1'>&gt; InvocationHelper</span>

>
>

> A generic class for providing thread-safe invocation of delegates. Can be
> used for (but not limited to) updating GUI elements from another thread.


А в чем смысл сего произведения?

Я так понимаю, что предлагается использовать конструкции вида:
private void btnOpenport_Click(object sender, EventArgs e)
{
    this.serialPort.Open();
}
private void serialPort_DataReceived(object sender,
             SerialDataReceivedEventArgs e)
{
    InvocationHelper<EventHandler>.Invoke(new EventHandler(delegate (object 
sender, EventArgs e){ this.outputTextBox.Text = 
this.serialPort.ReadExisting(); }));
}


А не проще сразу написать:
private void btnOpenport_Click(object sender, EventArgs e)
{
    this.serialPort.Open();
}

private void serialPort_DataReceived(object sender, 
SerialDataReceivedEventArgs e)
{
        if (InvokeRequeried)
        {
            Invoke(delegate { serialPort_DataReceived(sender, e); });
        }
        else
        {
            this.outputTextBox.Text = this.serialPort.ReadExisting();
        }
}


Либо, если хочется "поднавернуть кода", можно сделать реализацию которую
использовать в виде serialPort.DataReceived +=
EventHelper.BindToThread(serialPort_DataReceived) ?

PS.
Да и вообще, предложенный подход "безопасным" не назовешь... достаточно,
написать следующее ... и все "уедет"
    TextBox textBox = outputTextBox;
    InvocationHelper<EventHandler>.Invoke(new EventHandler(delegate (object 
sender, EventArgs e){ textBox.Text = "Done"; }));
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: [ANN] Generic InvocationHelper
От: squiz  
Дата: 29.09.06 20:16
Оценка:
Здравствуйте, TK, Вы писали:

TK>А не проще сразу написать:

TK>
TK>private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
TK>{
TK>        if (InvokeRequeried)
TK>        {
TK>            Invoke(delegate { serialPort_DataReceived(sender, e); });
TK>        }
TK>        else
TK>        {
TK>            this.outputTextBox.Text = this.serialPort.ReadExisting();
TK>        }
TK>}
TK>


А выделенное разве скомпилируется?
Разве что так (и InvokeRequired надо видимо у outputTextBox спрашивать):
MethodInvoker updateText = delegate
{
    this.outputTextBox.Text = this.serialPort.ReadExisting();
};

if (this.outputTextBox.InvokeRequired)
    this.outputTextBox.Invoke(updateText);
else
    updateText();
Never underestimate those behind you...
Re[3]: [ANN] Generic InvocationHelper
От: TK Лес кывт.рф
Дата: 01.10.06 18:16
Оценка:
Hello, "squiz"
>
> TK>А не проще сразу написать:
> TK>
> TK>private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
> TK>{
> TK>        if (InvokeRequeried)
> TK>        {
> TK>            Invoke(delegate { serialPort_DataReceived(sender, e); });
> TK>        }
> TK>        else
> TK>        {
> TK>            this.outputTextBox.Text = this.serialPort.ReadExisting();
> TK>        }
> TK>}
> TK>

>
> А выделенное разве скомпилируется?

Текст боксы обычно лежат на формах или других контролах у которых Invoke и InvokeRequired уже присутствуют.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: [ANN] Generic InvocationHelper
От: squiz  
Дата: 08.10.06 09:35
Оценка:
Здравствуйте, TK, Вы писали:

>> TK> Invoke(delegate { serialPort_DataReceived(sender, e); });


TK>Текст боксы обычно лежат на формах или других контролах у которых Invoke и InvokeRequired уже присутствуют.

Нет, я о том что такая строка не прокатит (с анонимным методом)
Never underestimate those behind you...
Re[5]: [ANN] Generic InvocationHelper
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.01.07 10:23
Оценка:
Здравствуйте, squiz, Вы писали:

>>> TK> Invoke(delegate { serialPort_DataReceived(sender, e); });


TK>>Текст боксы обычно лежат на формах или других контролах у которых Invoke и InvokeRequired уже присутствуют.

S>Нет, я о том что такая строка не прокатит (с анонимным методом)

такая прокатывает:

Invoke(new MethodInvoker(delegate { serialPort_DataReceived(sender, e); }));
... << RSDN@Home 1.2.0 alpha rev. 668>>
Re[6]: [ANN] Generic InvocationHelper
От: desco США http://v2matveev.blogspot.com
Дата: 11.01.07 10:53
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, squiz, Вы писали:


>>>> TK> Invoke(delegate { serialPort_DataReceived(sender, e); });


TK>>>Текст боксы обычно лежат на формах или других контролах у которых Invoke и InvokeRequired уже присутствуют.

S>>Нет, я о том что такая строка не прокатит (с анонимным методом)

OE>такая прокатывает:


OE>
OE>Invoke(new MethodInvoker(delegate { serialPort_DataReceived(sender, e); }));
OE>


Re[3]: Изменение свойтсв контрола в другом потоке
Автор: desco
Дата: 28.12.06
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.