小编For*_*rna的帖子

具有单实例化的全局线程安全多值自定义字典

我想有一个类似于不同线程之间共享的多值字典的全局对象.

我希望只创建一次对象(例如从数据库获取数据),然后由不同的线程使用.

Object应该可以使用其他属性轻松扩展(目前只有JobName和URL).

如果可能的话,我宁愿避免锁定.

我面临以下问题:

  • 下面显示的当前版本不是线程安全的;
  • 我不能使用ConcurrentDictionary,因为我已经扩展了Dictionary对象以允许每个键的多个值;

这是应该轻松修改的对象结构:

    public struct JobData
    {
        public string JobName;
        public string URL;
    }
Run Code Online (Sandbox Code Playgroud)

我已经扩展了Dictionary对象,允许每个键有多个值:

    public class JobsDictionary : Dictionary<string, JobData>
    {
        public void Add(string key, string jobName, string url)
        {
            JobData data;
            data.JobName = jobName;
            data.URL = url;
            this.Add(key, data);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在Threads之间共享的静态类.正如您所看到的,它在第一次为该Job调用时为特定Job创建了一个Dictionary条目.

例如,第一次调用"收益"时,它将创建"收入"字典条目.这会产生线程安全问题:

public static class GlobalVar
{
    private static JobsDictionary jobsDictionary = new JobsDictionary();
    public static JobData Job(string jobCat)
    {   
        if (jobsDictionary.ContainsKey(jobCat))
            return jobsDictionary[jobCat];
        else
        {
            String jobName;
            String url = null; …
Run Code Online (Sandbox Code Playgroud)

c# multithreading global-variables thread-safety

3
推荐指数
1
解决办法
1488
查看次数