第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

同步集合 InvalidOperationException/System

同步集合 InvalidOperationException/System

C#
泛舟湖上清波郎朗 2022-12-24 14:45:44
我編寫(xiě)了一些類(lèi)來(lái)使用SynchronizedCollection.class MultithreadTesting{    public readonly SynchronizedCollection<int> testlist = new SynchronizedCollection<int>();    public SynchronizedReadOnlyCollection<int> pubReadOnlyProperty    {        get        {            return new SynchronizedReadOnlyCollection<int>(testlist.SyncRoot, testlist);        }    }    public void Test()    {        int numthreads = 20;        Thread[] threads = new Thread[numthreads];        List<Task> taskList = new List<Task>();        for (int i = 0; i < numthreads / 2; i++)        {            taskList.Add(Task.Factory.StartNew(() =>            {                for (int j = 0; j < 100000; j++)                {                    testlist.Add(42);                }            }));        }        for (int i = numthreads / 2; i < numthreads; i++)        {            taskList.Add(Task.Factory.StartNew(() =>            {                var sum = 0;                foreach (int num in pubReadOnlyProperty)                {                    sum += num;                }            }));        }        Task.WaitAll(taskList.ToArray());        testlist.Clear();    }}運(yùn)行它我使用    MultithreadTesting test = new MultithreadTesting();    while (true)        test.Test();但是代碼讓我失望System.ArgumentException: 'Destination array was not long enough. Check destIndex and length, and the array's lower bounds.'如果我嘗試使用testlistin foreach,我會(huì)得到System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'然而,MSDN 告訴我們SynchronizedReadOnlyCollection 類(lèi)提供一個(gè)線程安全的只讀集合,其中包含泛型參數(shù)指定類(lèi)型的對(duì)象作為元素。
查看完整描述

1 回答

?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊

錯(cuò)誤的根本原因是List<T>構(gòu)造不是線程安全的。


讓我們看看在構(gòu)造 new 時(shí)會(huì)發(fā)生什么SynchronizedReadOnlyCollection。異常發(fā)生在以下行:


return new SynchronizedReadOnlyCollection<int>(testlist.SyncRoot, testlist);

正如異常 StackTrace 告訴我們的那樣,List<T>..ctor在構(gòu)建過(guò)程中涉及到:


at System.Collections.Generic.SynchronizedCollection`1.CopyTo(T[] array, Int32 index)

at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)

at System.Collections.Generic.SynchronizedReadOnlyCollection`1..ctor(Object syncRoot, IEnumerable`1 list)

構(gòu)造函數(shù)中的以下片段List<T>顯示了錯(cuò)誤發(fā)生的位置。代碼是從MS 參考源中復(fù)制的,我清理了代碼中不需要的部分以便于閱讀。請(qǐng)注意,在注釋 (1) 和 (2) 之間還有其他線程在操作集合:


public List(IEnumerable<T> collection) {

    ICollection<T> c = collection as ICollection<T>;

    // (1) count is now current Count of collection

    int count = c.Count;

    // other threads can modify collection meanwhile

    if (count == 0)

    {

        _items = _emptyArray;

    }

    else {

        _items = new T[count];

        // (2) SynchronizedCollection.CopyTo is called (which itself is thread-safe)

        // Collection can still be modified between (1) and (2) 

        // No when _items.Count != c.Count -> Exception is raised.

        c.CopyTo(_items, 0);

        _size = count;

    }

}

解決方案


testlist在構(gòu)造 new 時(shí),可以通過(guò)鎖定修改輕松解決該問(wèn)題SynchronizedReadOnlyCollection。


public SynchronizedReadOnlyCollection<int> pubReadOnlyProperty

{

    get

    {

        lock (testlist.SyncRoot)

        {

            return new SynchronizedReadOnlyCollection<int>(testlist.SyncRoot, testlist);

        }

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-12-24
  • 1 回答
  • 0 關(guān)注
  • 147 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)