Thursday, 15 April 2010

c# - using two instance of a class in a button-click event give me error -



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