[英]using two instance of a class in a button-click event give me error
我有一個名為表tbl_search
由三個id(int) title(string) result(string)
我創建了一個名為類SearchInGoogle
並寫上兩個方法, FindOdd
和FindEven
,第一種方法通過奇怪的ID(1查找記錄, 3,5,7,9,...),然后在Google中搜索its Title
並將結果放在result
,第二種方法與第一種方法類似,但要通過偶數id(2,4,6,8,10進行記錄,...):
public class SearchInGoogle
{
GoogleEntities db = new GoogleEntities();
public void FindOdd()
{
List<tbl_search> _oddSearchList = db.tbl_search.Where(c => (c.id % 2) != 0).ToList();
var client = new GwebSearchClient("http://www.google.com");
foreach (var item in _oddSearchList)
{
var results = client.Search(item.title, 1);
tbl_search _saveSearchResult = _oddSearchList.Where(x => x.id == item.id).FirstOrDefault();
_saveSearchResult.result = results.FirstOrDefault().ToString();
db.SaveChanges();
}
}
public void FindEven()
{
List<tbl_search> _evenSearchList = db.tbl_search.Where(c => (c.id % 2) == 0).ToList();
var client = new GwebSearchClient("http://www.google.com");
foreach (var item in _evenSearchList)
{
var results = client.Search(item.title, 1);
tbl_search _saveSearchResult = _evenSearchList.Where(x => x.id == item.id).FirstOrDefault();
_saveSearchResult.result = results.FirstOrDefault().ToString();
db.SaveChanges();
}
}
}
我在Form1.cs的SearchInGoogle class
中創建了兩個Thread
和兩個實例,並為button-click
事件啟動了線程:
public partial class Form1 : Form
{
GoogleEntities db = new GoogleEntities();
Thread th1;
Thread th2;
SearchInGoogle _sin = new SearchInGoogle();
SearchInGoogle _sin2 = new SearchInGoogle();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Thread th = new Thread(new ThreadStart(update));
}
private void button1_Click(object sender, EventArgs e)
{
th1 = new Thread(new ThreadStart(_sin.FindOdd));
th2 = new Thread(new ThreadStart(_sin2.FindEven));
th1.Start();
th2.Start();
}
}
但是當我單擊按鈕時,它給我錯誤NullReferenceException
! 我該如何解決?
如果沒有鎖定,則無法從多個線程訪問單個資源。 您正在執行:
db.SaveChanges();
使用兩個線程中的任何一個,這都會使應用程序失敗。 您需要通過不同的線程來鎖定對單個資源的訪問。 您也正在使用FirstOrDefault,如果結果為null,則在調用ToString()時將失敗。 像這樣做:
public class SearchInGoogle
{
GoogleEntities db = new GoogleEntities();
object dbLock = new object();
public void FindOdd()
{
List<tbl_search> _oddSearchList = db.tbl_search.Where(c => (c.id % 2) != 0).ToList();
var client = new GwebSearchClient("http://www.google.com");
foreach (var item in _oddSearchList)
{
var results = client.Search(item.title, 1);
tbl_search _saveSearchResult = _oddSearchList.First(x => x.id == item.id);
_saveSearchResult.result = results.First().ToString();
lock(dbLock)
{
db.SaveChanges();
}
}
}
public void FindEven()
{
List<tbl_search> _evenSearchList = db.tbl_search.Where(c => (c.id % 2) == 0).ToList();
var client = new GwebSearchClient("http://www.google.com");
foreach (var item in _evenSearchList)
{
var results = client.Search(item.title, 1);
tbl_search _saveSearchResult = _evenSearchList.First(x => x.id == item.id);
_saveSearchResult.result = results.First().ToString();
lock(dbLock)
{
db.SaveChanges();
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.