【发布时间】:2012-11-04 17:40:48
【问题描述】:
我正在学习创建事件和创建多线程应用程序。
方法Thread 被另一个类调用,该类使用搜索条件填充参数。创建BackgroundWorker,执行搜索并将结果返回给worker_RunWorkerCompleted。
在worker_RunWorkerCompleted 内,我想将结果发送回订阅Fireendofsearch 事件的UI。
我无法理解为什么下面的代码会引发以下错误
对象引用未设置为对象的实例。
当我触发事件Fireendofsearch
public class BackgroundSearch
{
public event SearchResultCompleteThreaded Fireendofsearch;
public EventArgs a = null;
public delegate void SearchResultCompleteThreaded(object seachresults, EventArgs a);
internal void Thread(string folder, string parms)
{
var Argument = new List<object> { folder, parms };
var worker = new BackgroundWorker {WorkerReportsProgress = false, WorkerSupportsCancellation = false};
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync(Argument);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var passedAugue = e.Argument as List<object>;
var returnResult = new List<string[]>();
if (passedAugue != null)
{
var result = Directory.GetFiles(passedAugue[0].ToString(), passedAugue[1].ToString(), SearchOption.AllDirectories);
foreach (string s in result)
{
var t = new string[4];
t[0] = s;
t[1] = File.GetCreationTime(s).ToString();
t[2] = File.GetLastAccessTime(s).ToString();
t[3] = File.GetLastWriteTime(s).ToString();
returnResult.Add(t);
}
}
if (returnResult.Count != 0)
{
e.Result = returnResult;
}
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Result != null)
{
Fireendofsearch(e.Result, a);
}
}
}
【问题讨论】:
-
更新:问题与订阅有关。我在 UI 线程中订阅了该事件,但该事件是由另一个类的“代理”引发的。 IE。 UI 调用了 A 类中的一个方法,A 类调用了 B 类中的另一个方法。B 类引发了事件,而不是 A 类。移动事物我得到了我想要的结果,但我忍不住想我我错过了一些东西。为什么我不能从通过 A 类发起的 UI 订阅 B 类中的事件?
标签: c# multithreading events