首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后台字典加载

后台字典加载
EN

Stack Overflow用户
提问于 2012-03-23 17:02:13
回答 3查看 588关注 0票数 2

这看起来应该如此简单,但显然并非如此。

我有一本字典,需要在程序启动时加载40000个条目。它只延迟5-7秒的加载时间,但我想在后台这样做,以避免这种情况。

在下面的代码中,有三个部分处理我目前拥有的dictionaryBackgroundWorker

我知道这段代码使它成为PopulateZipCodeDictionary()方法,但出于某种原因,它实际上并没有启动该方法。

我做错了什么?

代码语言:javascript
复制
    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");
    }
代码语言:javascript
复制
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...
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-23 17:09:41

这是一个用于后台处理的例程。您只需在处理完成时给RunBehind一个要执行的操作和一个要调用的操作。

代码语言:javascript
复制
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();
    }
}

也许试着锁上..。

代码语言:javascript
复制
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;
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-03-23 17:10:05

我只看到两种情况:

  1. DoWork事件处理程序实际上已被执行,您不知怎么忽略了这一点,放置一个断点将是查看实际情况的最有效方法。
  2. 引发了一些问题,因此在事件args中引发了一个错误的RunWorkerCompleted事件。

MSDN,BackgroundWorker.RunWorkerCompleted事件

在后台操作完成、已取消或引发异常时发生。System.ComponentModel.RunWorkerCompletedEventArgs的错误属性指示操作引发异常。

票数 1
EN

Stack Overflow用户

发布于 2012-03-23 17:18:52

尝试将已完成的事件处理程序更改为:

代码语言:javascript
复制
static void populateZipCodeDictionary_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
        MessageBox.Show(e.Error.ToString());
    else
        MessageBox.Show("Dictionary loaded");
}

我猜您的DoWork处理程序正在抛出一个异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9843371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档