多线程更新数据库 死锁
public void DoWord(object o)
{
string[] proxy = o as string[];
int _myIndex = Convert.ToInt32(proxy[2]);
//一直运行直到手动关闭
while (!m_boolCatchFinished)
{
//线程暂停
if (!ThreadList[_myIndex].boolStoped)
{
string[] ds = null;
//线程同步
Queue q = Queue.Synchronized(m_queueList);
if (q.Count > 0)
{
ds = q.Dequeue().ToString().Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
try
{
string html = RequestGet.GetResponseBody(ds[1].ToString(), proxy[0], Convert.ToInt32(proxy[1]), true);
//updata 同 一个表
UpdateProject(ds[0].ToString(), html);
m_intCatchCount++;
ShowText mi = new ShowText(SetTxt);
BeginInvoke(mi, new object[] { m_intCatchCount, _myIndex, "", Thread.CurrentThread.ManagedThreadId.ToString() });
}
catch (Exception ex)
{
ShowText mi = new ShowText(SetTxt);
BeginInvoke(mi, new object[] { m_intCatchCount, _myIndex, ex.Message, Thread.CurrentThread.ManagedThreadId.ToString() });
continue;
}
}
}
}
}
protected void UpdateProject(string id, string html)
{
using (SqlConnection conn = new SqlConnection(m_strConn))
{
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "update nanjing_soufun_project set html=@html,catched=1 where id='" + id.ToString() + "'";
comm.Parameters.Add(new SqlParameter("@html", SqlDbType.NVarChar) { Value = html });
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
}
}
多线程时 更新 同一张表 会发生 死锁 请教下 原因
lock (ss)
{
//updata 同 一个表
UpdateProject(ds[0].ToString(), html);
}
这样之后就不会死锁