c# - using two instance of a class in a button-click event give me error -
i have table named tbl_search
3 columns id(int) title(string) result(string)
create class named searchingoogle
, write 2 methods on it, findodd
andfindeven
, first method find record odd id (1,3,5,7,9,...) , search its title
in google , set result on result
, sec method first method record 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(); } } }
i create 2 thread
, 2 instance searchingoogle class
in form1.cs , button-click
event start thread:
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(); } }
but when click on button give me error nullreferenceexception
! how can prepare it?
you cannot access single resource multiple threads without locking. doing:
db.savechanges();
with of 2 threads , create application fail. need lock access single resource different threads. using firstordefault , fail when calling tostring() if result null. this:
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(); } } } }
c# multithreading thread-safety
No comments:
Post a Comment