簡體   English   中英

在按鈕單擊事件中使用類的兩個實例給我錯誤

[英]using two instance of a class in a button-click event give me error

我有一個名為表tbl_search由三個id(int) title(string) result(string)我創建了一個名為類SearchInGoogle並寫上兩個方法, FindOddFindEven ,第一種方法通過奇怪的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM