PDA

View Full Version : کسی با Delegate ها کار کرده؟



Developer Programmer
یک شنبه 05 مهر 1388, 19:58 عصر
یه برنامه چت، تحت C#‎‎‎‎‎ دارم که بنا به دلایلی باید اون رو به VB.Net تبدیل کنم.

قسمتی از برنامه که برای فهمیدن ورود و خروج کاربران استفاده میشه، به این شکله


public class StatusChangedEventArgs : EventArgs
{
// The argument we're interested in is a message describing the event
private string EventMsg;
// Property for retrieving and setting the event message
public string EventMessage
{
get
{
return EventMsg;
}
set
{
EventMsg = value;
}
}
// Constructor for setting the event message
public StatusChangedEventArgs(string strEventMsg)
{
EventMsg = strEventMsg;
}
}
// This delegate is needed to specify the parameters we're passing with our event
public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e);
حالا در کلاس دیگر از این delegate بصورت event استفاده میشه


class ChatServer
{
// The event and its argument will notify the form when a user has connected, disconnected, send message, etc.
public static event StatusChangedEventHandler StatusChanged;
private static StatusChangedEventArgs e;
// This is called when we want to raise the StatusChanged event
public static void OnStatusChanged(StatusChangedEventArgs e)
{
StatusChangedEventHandler statusHandler = StatusChanged;
if (statusHandler != null)
{
// Invoke the delegate
statusHandler(null, e);
}
}
مشکل دقیقا اینه که من این قسمت رو


StatusChangedEventHandler statusHandler = StatusChanged;
در VB.Net به این صورت می نویسم


Public Shared Event StatusChanged As StatusChangedEventHandler
Private Shared e As StatusChangedEventArgs
Private Shared StatusChanged As StatusChangedEventHandler

Public Shared Sub OnStatusChanged(ByVal e As StatusChangedEventArgs)
Dim statusHandler As StatusChangedEventHandler = ChatServer.StatusChanged
If (Not statusHandler Is Nothing) Then
statusHandler.Invoke(Nothing, e)
End If
End Sub
اما دات نت گیر داده که


Dim statusHandler As StatusChangedEventHandler = ChatServer.StatusChanged
اشتباهه ! از چند decompiler هم استفاده کردم اما همشون دقیقا مثل من نوشتن!

ممکنه راهنمایی کنین که اشکال کار از کجاست؟

reza1944
یک شنبه 05 مهر 1388, 20:45 عصر
و اگه درست بگم با يك Thread اون ساب OnStatusChanged رو فرا خواني ميكني و خطاي
Cross-thread operation not valid: Control 'object' accessed from a thread other than the thread it was created on.
رو داري

نميدونم هر چي نگاه مي كنم دستورات يه جوراي كمه چون يه Delegate نياز داري

حالا يك

reza1944
یک شنبه 05 مهر 1388, 20:50 عصر
مثال ساده


Delegate Sub SetTextCallback(ByVal [text] As String)


Private Sub setTextSafeBtn_Click( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles setTextSafeBtn.Click
Me.demoThread = New Thread( _
New ThreadStart(AddressOf Me.ThreadProcSafe))
Me.demoThread.Start()
End Sub
Private Sub ThreadProcSafe()
Me.SetText("This text was set safely.")
End Sub


Private Sub SetText(ByVal [text] As String)
If Me.textBox1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
Else
Me.textBox1.Text = [text]
End If
End Sub


حال Thread بعد از فراخواني درست كار ميكند

Developer Programmer
دوشنبه 06 مهر 1388, 06:31 صبح
ممنون از پاسخت

درسته که توش از ترید استفاده شده اما اون خطایی که شما گفتید نمی اد
VB گیر داده که نمیتونی از = استفاده کنی و به جاش باید RaiseEvent بذاری