多线程这样访问List对吗?

游戏人间 CSDN会员 游戏人间 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
多线程这样访问List。

大家帮忙看一下DoWork这个函数这样访问List会不会有问题?



public partial class Form1 : Form
{
int count = 8;
object obj = new object();
Thread thread;
ManualResetEvent[] events;
List<TaskInfo> tasks;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
txtMsg.Text = "";
thread = new Thread(new ThreadStart(Test));
thread.Start();

}

public void Test()
{
events = new ManualResetEvent[count];
tasks = Init();
for (int i = 0; i < count; i++)
{
events[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i);
}

ManualResetEvent.WaitAll(events);

InvokeSetText("任务完成");
}

public void DoWork(object o)
{
int i = (int)o;
TaskInfo model;
while (tasks.Count > 0)
{
Monitor.Enter(obj);
try
{
model = tasks[0];
tasks.RemoveAt(0);
}
finally
{
Monitor.Exit(obj);
}
Thread.Sleep(2000);
//长任务抓网页Snap(model.Url);
InvokeSetText(string.Format("{0} 线程:{1}",model.Name,o));
Thread.Sleep(1000);
}
events[i].Set();
}

public delegate void SetTextHandler(string msg);

public void InvokeSetText(string msg)
{
SetTextHandler d = new SetTextHandler(SetText);
Invoke(d, msg);
}

public void SetText(string msg)
{
txtMsg.Text = msg + "\r\n" + txtMsg.Text;
}


public List<TaskInfo> Init()
{
List<TaskInfo> taskInfos = new List<TaskInfo>();
TaskInfo task;
for (int i = 0; i < 30; i++)
{
task = new TaskInfo(i.ToString(), string.Format("任务{0}", i),"www.hao123.com");
taskInfos.Add(task);
}

return taskInfos;

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (thread != null)
{
thread.Abort();

}
}
}

public class TaskInfo
{
private string m_Id;
private string m_Name;
private string m_Url;

public string Id
{
get { return m_Id; }
set { m_Id = value; }
}


public string Name
{
get { return m_Name; }
set { m_Name = value; }
}

public string Url
{
get { return m_Url; }
set { m_Url = value; }
}

public TaskInfo()
{ }

public TaskInfo(string _id, string _name,string _url)
{
m_Id = _id;
m_Name = _name;
m_Url = _url;
}

}
...全文

相关推荐

评论 20
收藏 已收藏
分享
返回顶部
游戏人间 CSDN会员
C# 111,129 成员 642,539 内容