使用事件 Action<T> 引发事件
raising events using event Action<T>
我习惯使用委托 EventHandler 进行事件回调,但现在我尝试使用事件 Action 来调用事件。我找不到太多关于如何在任何地方正确使用它的信息,所以我希望有人能给我指明正确的方向。
我有一个处理字符串对象的 Action 事件处理程序。在我的订阅者 class 中,我有 public event Action<string> UploadProgress;
。事件处理程序是这样调用的:
UploadProgress.Invoke(string.Format("sending file data {0:0.000}%", (bytesSoFar * 100.0f) / totalToUpload));
侦听器 class 订阅了此事件,如下所示:
uploadFile.UploadProgress += uploadFile_UploadProgress;
void uploadFile_UploadProgress(string obj)
{
var prog = obj;
}
调用事件时,我得到 System.NullReferenceException: Object reference not set to an instance of an object
。我不确定我需要在订户 class 中更改什么以避免此错误。有人可以告诉我使用事件操作的正确方法或提供 link 到我可以阅读的地方吗?我知道如何使用正常的 Action 但对将其声明为事件感到困惑。感谢任何帮助。
这种方式更好,通过事件发送bytesToUpload和totalToUpload,而不是整个Action(右例):
internal class Program
{
private static void Main(string[] args)
{
SomeClass someClass = new SomeClass();
someClass.UploadProgress += SomeClass_UploadProgress;
someClass.DoSomeUpload();
}
private static void SomeClass_UploadProgress(object sender, UploadEventArgs e)
{
string s = string.Format("sending file data {0:0.000}%", (e.BytesSoFar * 100.0f) / e.TotalToUpload);
Console.WriteLine(s);
}
}
public class UploadEventArgs : EventArgs
{
public float BytesSoFar { get; set; }
public float TotalToUpload { get; set; }
}
public class SomeClass
{
public event EventHandler<UploadEventArgs> UploadProgress;
public void DoSomeUpload()
{
if (UploadProgress != null)
{
UploadEventArgs e = new UploadEventArgs();
e.BytesSoFar = 123f;
e.TotalToUpload = 100000f;
UploadProgress.Invoke(this, e);
}
}
}
我习惯使用委托 EventHandler 进行事件回调,但现在我尝试使用事件 Action 来调用事件。我找不到太多关于如何在任何地方正确使用它的信息,所以我希望有人能给我指明正确的方向。
我有一个处理字符串对象的 Action 事件处理程序。在我的订阅者 class 中,我有 public event Action<string> UploadProgress;
。事件处理程序是这样调用的:
UploadProgress.Invoke(string.Format("sending file data {0:0.000}%", (bytesSoFar * 100.0f) / totalToUpload));
侦听器 class 订阅了此事件,如下所示:
uploadFile.UploadProgress += uploadFile_UploadProgress;
void uploadFile_UploadProgress(string obj)
{
var prog = obj;
}
调用事件时,我得到 System.NullReferenceException: Object reference not set to an instance of an object
。我不确定我需要在订户 class 中更改什么以避免此错误。有人可以告诉我使用事件操作的正确方法或提供 link 到我可以阅读的地方吗?我知道如何使用正常的 Action 但对将其声明为事件感到困惑。感谢任何帮助。
这种方式更好,通过事件发送bytesToUpload和totalToUpload,而不是整个Action(右例):
internal class Program
{
private static void Main(string[] args)
{
SomeClass someClass = new SomeClass();
someClass.UploadProgress += SomeClass_UploadProgress;
someClass.DoSomeUpload();
}
private static void SomeClass_UploadProgress(object sender, UploadEventArgs e)
{
string s = string.Format("sending file data {0:0.000}%", (e.BytesSoFar * 100.0f) / e.TotalToUpload);
Console.WriteLine(s);
}
}
public class UploadEventArgs : EventArgs
{
public float BytesSoFar { get; set; }
public float TotalToUpload { get; set; }
}
public class SomeClass
{
public event EventHandler<UploadEventArgs> UploadProgress;
public void DoSomeUpload()
{
if (UploadProgress != null)
{
UploadEventArgs e = new UploadEventArgs();
e.BytesSoFar = 123f;
e.TotalToUpload = 100000f;
UploadProgress.Invoke(this, e);
}
}
}