#vb.net #multithreading #visual-studio-2010 #dataset
#vb.net #Многопоточность #visual-studio-2010 #набор данных
Вопрос:
Я использовал следующий код внутри класса и создавал экземпляр этого класса из моей основной формы (Main.vb):
Dim count As Integer = Main.DbDataSet.Accounts.Count
Это возвращало количество учетных записей в моей базе данных.
После изменения кода, чтобы я мог запускать это в фоновом потоке, чтобы сохранить блокировку программы, поскольку после этого обрабатывается больше данных, счетчик каждый раз возвращал 0.
Можно ли получить доступ к моему DbDataSet в потоковом процессе (другой класс)?
Ответ №1:
Из вашего описания, я полагаю, вам нужно больше прочитать о потоковой обработке. Это делается для того, чтобы убедиться, что вы осознаете, что играете с обоюдоострым лезвием (нарезанием резьбы). Есть несколько хороших материалов, которые вы можете найти в сети. А именно многопоточность в C #.
Теперь, имея ограниченные знания о том, что вы пытаетесь сделать с вашей стороны; после кода нарисуйте синюю печать о том, как должен выглядеть код.
class YourForm
{
private DataSet dataSet;
public int Count { get; set; }
SynchronizationContext runningContext;
public YourForm()
{
}
void FillData()
{
//fill your dataset with required data
}
void ProcessInWorker()
{
runningContext=SynchronizationContext.Current;
Two secondClass = new Two();
secondClass.DoWork =secondClass_DoWork;
secondClass.RunWorkerCompleted =secondClass_RunWorkerCompleted;
YourRequest re=new YourRequest()
{
DatasetToSend=dataSet
}
secondClass.RunWorkerAsync(re);
}
void secondClass_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null) throw e.Error;
YourResponse cResponse = e.Result as YourResponse;
if (cResponse == null) return;
dataSet = cResponse.RefilledData;//latest data will be here on completion of worker thread.
//if you want you can update latest count in some UI control say txtRecordCount
runningContext.Post(new SendOrPostCallback(delegate
{
txtRecordCount.Text=//give your row count here;
}), null);
}
void secondClass_DoWork(object sender, DoWorkEventArgs e)
{
try
{
YourRequest cRequest = e.Argument as YourRequest;
cRequest.DatasetToSend = RefillData();
YourResponse cResponse=new YourResponse()
{
RefilledData=cRequest.DatasetToSend
};
e.Result = cResponse;
}
catch
{
throw
}
}
DataSet RefillData()
{
//put your logic here to refill the data in dataset
//return the dataset;
}
}
class Two : BackgroundWorker
{
//sub classing background worker and rest of your own
//logic which you are planning for second class.
}
class YourRequest
{
public YourRequest ()
{
}
public DataSet DatasetToSend{get;set;}
}
class YourResponse
{
public YourResponse()
{
}
public DataSet RefilledData { get; set; }
}