这看起来应该如此简单,但显然并非如此。
我有一本字典,需要在程序启动时加载40000个条目。它只延迟5-7秒的加载时间,但我想在后台这样做,以避免这种情况。
在下面的代码中,有三个部分处理我目前拥有的dictionary和BackgroundWorker。
我知道这段代码使它成为PopulateZipCodeDictionary()方法,但出于某种原因,它实际上并没有启动该方法。
我做错了什么?
static BackgroundWorker populateZipCodeDictionary;
public MainWindow()
{
populateZipCodeDictionary = new BackgroundWorker();
populateZipCodeDictionary.DoWork += populateZipCodeDictionary_DoWork;
populateZipCodeDictionary.RunWorkerCompleted += populateZipCodeDictionary_RunWorkerCompleted;
populateZipCodeDictionary.RunWorkerAsync();
}
static void populateZipCodeDictionary_DoWork(object sender, DoWorkEventArgs e)
{
ZipCodes.PopulateZipCodeDictionary();
}
static void populateZipCodeDictionary_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Dictionary loaded");
}static class ZipCodes
{
#region Methods
public static string GetValue(string key)
{
string result;
if (zipCodeDictionary.TryGetValue(key, out result))
{
return result;
}
else
{
return null;
}
}
#endregion
#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();
public static void PopulateZipCodeDictionary()
{
zipCodeDictionary.Add( "00501", "Holtsville, NY" );
zipCodeDictionary.Add( "00544", "Holtsville, NY" );
zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
zipCodeDictionary.Add( "00602", "Aguada, PR" );
zipCodeDictionary.Add( "00603", "Aguadilla, PR" );
zipCodeDictionary.Add( "00604", "Aguadilla, PR" );
//Continues on adding ~40k entries...
}发布于 2012-03-23 17:09:41
这是一个用于后台处理的例程。您只需在处理完成时给RunBehind一个要执行的操作和一个要调用的操作。
public class Worker
{
private Dispatcher _appDispatcher = Dispatcher.CurrentDispatcher;
private Dispatcher _workerDispatcher;
private Thread _workerThread;
public Worker()
{
_workerThread = new Thread(RunWorkerThread);
_workerThread.Start();
}
public void RunBehind(Action a_action, Action a_callback)
{
_workerDispatcher.BeginInvoke(new Action(() =>
{
a_action();
_appDispatcher.BeginInvoke(a_callback);
}));
}
private void RunWorkerThread()
{
Thread.CurrentThread.Name = "AppWorker";
_workerDispatcher = Dispatcher.CurrentDispatcher;
Dispatcher.Run();
}
}也许试着锁上..。
static class ZipCodes
{
private static Object zipLocker = new Object();
#region Methods
public static string GetValue(string key)
{
lock (zipLocker)
{
string result;
if (zipCodeDictionary.TryGetValue(key, out result))
{
return result;
}
else
{
return null;
}
}
}
#endregion
#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = null;
public static void PopulateZipCodeDictionary()
{
Dictionary<string, string> workingDictionary = new Dictionary<string, string>();
workingDictionary.Add( "00501", "Holtsville, NY" );
workingDictionary.Add( "00544", "Holtsville, NY" );
workingDictionary.Add( "00601", "Adjuntas, PR" );
workingDictionary.Add( "00602", "Aguada, PR" );
workingDictionary.Add( "00603", "Aguadilla, PR" );
workingDictionary.Add( "00604", "Aguadilla, PR" );
//Continues on adding ~40k entries...
lock (zipLocker)
{
zipCodeDictionary = workingDictionary;
}
}
}发布于 2012-03-23 17:10:05
我只看到两种情况:
DoWork事件处理程序实际上已被执行,您不知怎么忽略了这一点,放置一个断点将是查看实际情况的最有效方法。RunWorkerCompleted事件。MSDN,BackgroundWorker.RunWorkerCompleted事件
在后台操作完成、已取消或引发异常时发生。System.ComponentModel.RunWorkerCompletedEventArgs的错误属性指示操作引发异常。
发布于 2012-03-23 17:18:52
尝试将已完成的事件处理程序更改为:
static void populateZipCodeDictionary_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
MessageBox.Show(e.Error.ToString());
else
MessageBox.Show("Dictionary loaded");
}我猜您的DoWork处理程序正在抛出一个异常。
https://stackoverflow.com/questions/9843371
复制相似问题