【发布时间】:2017-01-12 00:15:52
【问题描述】:
这是我的问题:
假设我有这个程序(我会尽量简化): receiveResultThread 等待来自不同网络客户端的结果,而 displayResultToUIThread 使用收到的所有结果更新 UI。
class Program
{
private static Tests TestHolder;
static void Main(string[] args)
{
TestHolder = new Tests();
Thread receiveResultsThread = new Thread(ReceiveResult);
receiveResultsThread.Start();
Thread displayResultToUIThread = new Thread(DisplayResults);
displayResultToUIThread.Start();
Console.ReadKey();
}
public static void ReceiveResult()
{
while (true)
{
if (IsNewTestResultReceivedFromNetwork())
{
lock (Tests.testLock)
TestHolder.ExecutedTests.Add(new Test { Result = "OK" });
}
Thread.Sleep(200);
}
}
private static void DisplayResults(object obj)
{
while (true)
{
lock (Tests.testLock)
{
DisplayAllResultInUIGrid(TestHolder.ExecutedTests);
}
Thread.Sleep(200);
}
}
}
class Test
{
public string Result { get; set; }
}
class Tests
{
public static readonly object testLock = new object();
public List<Test> ExecutedTests;
public Tests()
{
ExecutedTests = new List<Test>();
}
}
class UIManager
{
public static void DisplayAllResultInUIGrid(List<Test> list)
{
//Code to update UI.
}
}
考虑到范围是在其他线程向列表中添加测试时不更新 UI,因此使用是安全的:
lock (Tests.testLock)
或者我应该使用:
lock (TestHolder.testLock)
(改变testLock的静态属性)?
您认为这是编写此类程序的好方法还是您能提出更好的模式?
感谢您的帮助!
【问题讨论】:
-
您的目标是哪个框架?我问这个是因为如果您使用的是 4.0 或更高版本,您应该使用 Tasks msdn.microsoft.com/en-us/library/dd537609(v=vs.100).aspx
标签: c# multithreading