有趣的是,我要測試墓碑和併發性,並且在我簡單的設置過程中,我想到了什麼是真的,是否真的值得麻煩。但是現在,在設置了一些愚蠢的測試課程45分鐘後,我遇到了第一個我不明白的錯誤。WP7(C#)的簡單鎖定和ThreadPoolQuestion
似乎我需要在列表,鎖和線程中多做點練習。有沒有人知道爲什麼會引發非法操作異常(請參閱附件代碼)。
一個誰喜歡F5體驗更好,這裏是完整的解決方案(300KB)
http://www.filesavr.com/TXXXFVE40GTJK43
不要打開的意見,他們可能會崩潰的VS2010。而且你需要WP7工具,對不起,即使我很確定這個例子也可以在純C#上工作(不工作)。
[編輯] 我更新鏈接,現在它正在(與老代碼)
我發現的第一個錯誤,感謝評論。
這工作:
private void IncOneWithLock()
{
lock (CounterListOne)
{
IncListOne();
}
}
private void IncListOne()
{
if (CounterListOne == null)
{
Log("CounterListOne == null");
return;
}
var c = 0;
var oldList = CounterListOne.ToList();
foreach (var i in oldList)
{
CounterListOne[c++] = i + 1;
Thread.Sleep(Next(80*DelayFactor, 150*DelayFactor));
}
}
將繼續測試立碑的東西,可能後問題在以後的線程。更改列表而迭代 - 你好新手的錯誤:-)
[/編輯]
爲了您conveniece的厚望發生在這個功能,其操作無效厚望:
private void IncOneWithLock()
{
if (CounterListOne == null)
{
Log("CounterListOne == null");
return;
}
lock (this)
{
var c = 0;
foreach (var i in CounterListOne)
{
CounterListOne[c++] = i + 1;
Thread.Sleep(Next(80 * DelayFactor, 150 * DelayFactor));
}
}
}
以下是測試課程的完整來源:
public class CounterClass : TestBase
{
private DispatcherTimer _dT;
public int CounterA { get; set; }
public ObservableCollection<int> CounterListOne { get; set; }
public List<int> CounterListTwo { get; set; }
public List<int> CounterListThree { get; set; }
private const int DelayFactor = 10;
public CounterClass()
{
CounterListOne = new ObservableCollection<int>();
CounterListTwo = new List<int>();
CounterListThree = new List<int>();
InitCounterLists();
StartBackgroundLogger();
}
public void LogLists()
{
lock (this)
//lock (CounterListTwo)
// lock (CounterListThree)
{
Log("====================================================");
Log("CounterListOne " + String.Join("-", CounterListOne.Select(x => x.ToString()).ToArray()));
Log("CounterListTwo " + String.Join("-", CounterListTwo.Select(x => x.ToString()).ToArray()));
Log("CounterListThree " + String.Join("-", CounterListThree.Select(x => x.ToString()).ToArray()));
Log("====================================================");
}
}
public void RunTests()
{
Log("MultiIncWithoutLocks");
//MultiIncWithoutLocks();
Log("MultiIncWithLocks");
MultiIncWithLocks();
}
public void MultiIncWithoutLocks()
{
ThreadPool.QueueUserWorkItem(x => IncOneWithoutLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithoutLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithoutLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithoutLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithoutLock());
}
public void MultiIncWithLocks()
{
ThreadPool.QueueUserWorkItem(x => IncOneWithLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithLock());
ThreadPool.QueueUserWorkItem(x => IncOneWithLock());
}
private void IncOneWithoutLock()
{
var c = 0;
foreach (var i in CounterListOne)
{
CounterListOne[c++] = i+1;
Thread.Sleep(Next(80 * DelayFactor, 150 * DelayFactor));
}
}
private void IncOneWithLock()
{
if (CounterListOne == null)
{
Log("CounterListOne == null");
return;
}
lock (this)
{
var c = 0;
foreach (var i in CounterListOne)
{
CounterListOne[c++] = i + 1;
Thread.Sleep(Next(80 * DelayFactor, 150 * DelayFactor));
}
}
}
private void InitCounterLists()
{
InitCounterOne();
InitCounterTwo();
InitCounterThree();
}
private void InitCounterOne()
{
for (int i = 0; i < Next(1, 5); i++)
{
CounterListOne.Add(0);
}
}
private void InitCounterTwo()
{
for (int i = 0; i < Next(1, 5); i++)
{
CounterListTwo.Add(0);
}
}
private void InitCounterThree()
{
for (int i = 0; i < Next(1, 5); i++)
{
CounterListThree.Add(0);
}
}
private void StartBackgroundLogger()
{
_dT = new DispatcherTimer();
_dT.Tick += (a,b) => LogLists();
_dT.Interval = new TimeSpan(0,0,0,3);
_dT.Start();
}
}
錯誤消息,堆棧轉儲,行號?代碼_does_的哪部分被執行? – 2011-03-02 09:58:47
您的鏈接項目丟失 – 2011-03-02 10:00:39