【发布时间】:2014-07-24 21:41:11
【问题描述】:
调用 runworkerasync 的事件:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.Length <= 3)
{
_ishouldnteventrytoupdate = true;
return;
}
_ishouldnteventrytoupdate = false;
_updated = false;
backgroundWorker1.RunWorkerAsync();
}
DoWork 函数:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// MessageBox.Show("hallo");
// if (_ishouldnteventrytoupdate) return;
//if (_updated) return;
allArtikels = DatabaseConn.GetAllArtikelsArrayList(false, textBox1.Text);
//backgroundWorker1.ReportProgress(100);
}
DatabaseConn 是一个静态类,这是被调用的函数:
public static ArrayList GetAllArtikelsArrayList(bool showAll,String naamZoeker = "")
{
SetupConnection();
_objConnection.Open();
var allArtikels = new ArrayList();
var strSql = "SELECT ";
if (!showAll)
{
strSql += "TOP 10";
}
strSql+=" HOOFDGROEP.HOOFDGROEP, SUBGROEP.SUBGROEP, Artikels.*" +
" FROM (Artikels LEFT JOIN HOOFDGROEP ON Artikels.HOOFDGROEPID = HOOFDGROEP.ID)" +
" LEFT JOIN SUBGROEP ON Artikels.SUBGROEPID = SUBGROEP.ID WHERE (ArtikelNaam LIKE '%' + @ArtikelNaam + '%');";
var objCommand = new OleDbCommand(strSql, _objConnection);
objCommand.Parameters.Add("@ArtikelNaam", OleDbType.Char).Value = naamZoeker;
try
{
var objReader = objCommand.ExecuteReader();
if (objReader != null && objReader.HasRows)
{
while (objReader.Read())
{
var objArtikel = new Artikel
{
SubGroepId = IntDbTester(objReader["SubgroepId"]),
HoofdGroepId = IntDbTester(objReader["HoofdgroepId"]),
AdviesPrijsIncl = DecimalDbTester(objReader["ArtikelAdviesPrijsIncl"]),
AdviesPrijsExcl = DecimalDbTester(objReader["ArtikelAdviesPrijsExcl"]),
BtwPercentage = IntDbTester(objReader["ArtikelBtwPercentage"]),
Naam = StringDbTester(objReader["ArtikelNaam"]),
OldId = StringDbTester(objReader["ArtikelOldId"]),
Id = IntDbTester(objReader["ArtikelId"]),
Voorraad = DoubleDbTester(objReader["ArtikelVoorraad"])
};
allArtikels.Add(objArtikel);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
_objConnection.Close();
return allArtikels;
IntDbTesters 、 Stringdbtester 等函数看起来像这样:
public static int IntDbTester(object s)
{
return s == DBNull.Value ? 0 : Convert.ToInt32(s);
}
SetupConnection() 看起来像这样:
private static void SetupConnection()
{
const string strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source='Klanten.accdb';" +
"Persist Security Info=False";
_objConnection = new OleDbConnection(strConnection);
}
除了 catch(以前从未调用过,所以我不认为使用 backgroundworker 会突然调用它)在 backgroundworker 中没有一个 UI,但是当我输入超过 3 个时,我的应用程序会永远冻结文本框中的字母。
可能是什么原因造成的?
编辑: 例外是:
System.dll 中发生了“System.InvalidOperationException”类型的未处理异常附加信息:Deze BackgroundWorker is momenteel bezet en kan niet meerdere take tegelijk uitvoeren。大致翻译为 backgorundworker 很忙,不能同时执行多个任务
if ((backgroundWorker1 != null) &&!backgroundWorker1.IsBusy)backgroundWorker1.RunWorkerAsync();
暂时解决这个问题,但我希望它实际上取消当前的工作并开始一个新的......
【问题讨论】:
-
您使用的是哪个 .net 版本?
-
一个后台工作者不能同时运行多个任务。有多种方法可以同时运行多次您的工作,但首先:考虑一下您的计划。每次您在文本框中输入内容时,您都在尝试启动一个线程,该线程将建立连接、检索结果并将结果分配给同一个变量。当多个线程同时尝试写入变量时会发生什么?在线程内建立 sql 连接需要小心处理。为什么不一次获取数据并在内存中过滤而不是每次都查询?
-
@zaitsman .NET Framework 4.5.1 与 Windows 8.1 一起安装
-
我希望这会发生(可能有点天真)是当前的后台工作人员被取消,它会再次尝试使用更新的值进行搜索
-
@MoSlo,坏主意 - 如果数据多于内存怎么办
标签: c# database backgroundworker freeze