Асинхронная загрузка данных

Язык C#
  1. год назад

    Здравствуйте.

    Помогите пожалуйста разобраться с проблемой загрузки данных в другом потоке. Есть код

    Task.Factory.StartNew(() =>
                {
                    ...
                    Task<GetDataStatus> getDataTask = new Task<GetDataStatus>(() => { return [b]GetDataTable(pathPIndex);[/b] });
                    getDataTask.Start();
    
                    GetDataStatus loadStatus = getDataTask.Result;
                    ...
                });
    private GetDataStatus [b]GetDataTable(string pathPIndex)[/b]
            {
                string pathFolder = Path.GetDirectoryName(pathPIndex);
                string nameDbfPIndex = Path.GetFileName(pathPIndex);
    
                string connectString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV;", pathFolder);
                string sqlSelect = string.Format("SELECT * FROM {0}", nameDbfPIndex);
                string sqlSelectCount = string.Format("SELECT count(*) FROM {0}", nameDbfPIndex);
    
                int countRecord = 0;
    
                OleDbConnection connection = null;
    
                OleDbCommand cmdOpenData = null;
                OleDbCommand cmdGetCountRecord = null;
    
                OleDbDataReader reader = null;
    
                try
                {
                    connection = new OleDbConnection(connectString);
    
                    cmdGetCountRecord = new OleDbCommand(sqlSelectCount, connection);
                    cmdOpenData = new OleDbCommand(sqlSelect, connection);
    
                    connection.Open();
    
                    countRecord = int.Parse(cmdGetCountRecord.ExecuteScalar().ToString());
    
                    frmMain.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        pbStatus.Minimum = 0;
                        pbStatus.Maximum = countRecord;
                        pbStatus.Value = 0;
    
                        lblInfo.Content = "Идет загрузка данных.";
                    }));
    
                    reader = cmdOpenData.ExecuteReader();
    
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            PIndexTable.Add(new PIndexModel
                            {
                                Index = reader["index"].ToString() == "" ? "null" : reader["index"].ToString(),                           
                                City = reader["city"].ToString() == "" ? "null" : string.Format(@"'{0}'", reader["city"].ToString()),
                            });
    
                            pbStatus.Dispatcher.BeginInvoke(new Action(() =>
                            {
                                pbStatus.Value++;                           
                            }));
                        }
    
                        return new GetDataStatus { Error = false, Message = "Данные успешно загружены!" };
                    }
    
                    return new GetDataStatus { Error = true, Message = "нет данных для загрузки." };
                }
                catch (Exception ex)
                {
                    return new GetDataStatus { Error = true, Message = ex.Message };
                }
                finally
                {
                    reader.Close();
                    if (connection.State == ConnectionState.Open)
                        connection.Close();
                    cmdOpenData.Dispose();
                }
            }

    По задумке ход загрузки данных должен отражаться в progressbar, но почему-то в это время форма становиться не доступна как при последовательном выполнении и соответственно хода загрузки не видно. Подскажите в чем может быть причина?

или зарегистрируйтесь чтобы ответить