VB.NET — Доступ к набору данных из экземпляра многопоточного класса?

#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; }
}