尝试使用backgroundworker从mdb读取数据时出现错误
程序'[3768] BackgroundWorkerExample.vshost.exe:Managed'已退出,代码为0(0x0)。
没有任何其他信息或例外,我无法抓住它。这是我的代码,没有BGW它工作正常。我想念一下吗?
namespace BackgroundWorkerExample
{
public class TestClass
{
BackgroundWorker _Worker;
public TestClass()
{
InitializeWorker();
}
public void InitializeWorker()
{
_Worker = new BackgroundWorker();
_Worker.DoWork += new DoWorkEventHandler(WorkerDoWork);
_Worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerRunWorkerCompleted);
}
private void WorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("Work completed!");
}
private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
DataTable data = GetDataTable();
PrintResults(data);
}
public void Run()
{
_Worker.RunWorkerAsync();
}
public DataTable GetDataTable()
{
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\students.mdb;";
try
{
using (OleDbConnection con = new OleDbConnection(connectionString))
{
try
{
con.Open(); // crashes here!
DataTable res = new DataTable();
string query = "SELECT * FROM students";
OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
adapter.Fill(res);
return res;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}
catch (Exception e)
{
// never reaches this part
return null;
}
}
public void PrintResults(DataTable data)
{
foreach (DataRow row in data.Rows)
{
for (int i = 0; i < 5; i++)
{
Console.Write(row[i] + " ");
}
Console.WriteLine();
}
}
}
}
答案 0 :(得分:1)
看起来你没有足够的时间让BackGroundWorker
执行。快速解决方法是检查BackGroundWorker是否正忙。如果它很忙,你可以让你的Main thread
等待一段时间后台工作人员可以完成其工作。
您看到的消息不是错误,只是表明线程已关闭(primary and the background worker thread
)
public void Run()
{
_Worker.RunWorkerAsync();
while (_Worker.IsBusy){
Thread.Sleep(4000);
}
}