[C#] Проблема с событем
От: Аноним  
Дата: 21.09.06 17:21
Оценка:
есть класс с событием

class Client
{
public class NewMessageArgs : EventArgs
{
public readonly string from, message;
public NewMessageArgs(string from, string message)
{
this.from = from;
this.message = message;
}
}

public delegate void NewMessageEventHandler(Object sender, NewMessageArgs args);

public event NewMessageEventHandler NewMessage;

protected virtual void OnNewMessage(NewMessageArgs e)
{
if (NewMessage != null)
NewMessage(this, e);
}

public void SimulateNewMessage(string from, string message)
{
NewMessageArgs e = new NewMessageArgs(from, message);

OnNewMessage(e);
}


public void Read()
{
ReadBuffer = new byte[BufferSize];

try
{
_Stream = _TcpClient.GetStream();
}
catch { }

_Stream.BeginRead(ReadBuffer, 0, BufferSize, new AsyncCallback(DoRead),null);
}

private void DoRead(IAsyncResult a)
{
try
{
int t = _Stream.EndRead(a);
string mess = Encoding.UTF8.GetString(ReadBuffer, 0, t);
SimulateNewMessage(null, mess);
_Stream.BeginRead(ReadBuffer, 0, BufferSize, new AsyncCallback(DoRead), null);
}
catch
{
MessageBox.Show("123");
Application.Exit();
}
}
}

класс, который подписывается на уведомление о событии

public partial class MessageWindow : Form
{
Client Guest;

public MessageWindow(Client Guest)
{
InitializeComponent();
this.Guest = Guest;
this.Guest.NewMessage += new Client.NewMessageEventHandler(Guest_NewMessage);
}
}

class Program
int main()
{
Client my = new Client(new TcpClient(textBox1.Text, 59));

MessageWindow mw = new MessageWindow(my);
mw.Show();
}

так вот, когда messagewindow должен реагировать на произошедшее событие, как то приход мессаги, ничего не происходит по след. причине:
protected virtual void OnNewMessage(NewMessageArgs e)
{
if (NewMessage != null) //NewMessage == null
NewMessage(this, e);
}

как сделать правильно? заранее благодарен
Re: [C#] Проблема с событем
От: _FRED_ Черногория
Дата: 21.09.06 17:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>есть класс с событием


1. Приятно, когда код виден красиво
[c#]
А>class Client

[/c#]

2. Простая и безопасная реализация многопоточности в Windows Forms.
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.
... << 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]: [C#] Проблема с событем
От: Аноним  
Дата: 22.09.06 04:01
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>1. Приятно, когда код виден красиво

Спасибо, в будущем учту

_FR>2. Простая и безопасная реализация многопоточности в Windows Forms.
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.

Отличная статейка, только так и не понял, как сделать в моем случае
Re[3]: [C#] Проблема с событем
От: _FRED_ Черногория
Дата: 22.09.06 07:22
Оценка:
Здравствуйте, <Аноним>, Вы писали:

_FR>>2. Простая и безопасная реализация многопоточности в Windows Forms.
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.

А>Отличная статейка, только так и не понял, как сделать в моем случае

Где вызывов Client.Read()?
... << RSDN@Home 1.2.0 alpha rev. 652>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: [C#] Проблема с событем
От: Аноним  
Дата: 22.09.06 11:03
Оценка:
_FR>Где вызывов Client.Read()?

_Stream.BeginRead(ReadBuffer, 0, BufferSize, new AsyncCallback(DoRead),null);

private void DoRead(IAsyncResult a)
{
...
int t = _Stream.EndRead(a);
string mess = Encoding.UTF8.GetString(ReadBuffer, 0, t);
SimulateNewMessage(null, mess);
_Stream.BeginRead(ReadBuffer, 0, BufferSize, new AsyncCallback(DoRead), null);
}

вместо Read использую комбинацию BeginRead(..) — EndRead(..)
Re: [C#] Проблема с событем
От: Аноним  
Дата: 21.09.06 20:22
Оценка:
Ошибка в этой строчке
public delegate void NewMessageEventHandler(Object sender, NewMessageArgs args);

вроде так надо писать
public delegate void NewMessageEventHandler(string from, string message);
____________________________________________________
ученье — свет, а не ученье — чуть свет и на работу


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.