Хотите установить потоки пользовательского интерфейса в прогресс-бар в C #, когда я импортирую данные в базу данных - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть метод с именем Import, который импортирует данные файла XML в базу данных.Это выглядит так:

private void SavingXMLFile()
    {
        //Save the file:
        if (rootElement != null)
        {
            try
            {
                using (FileStream fsHosp = new FileStream("Data/ConfigOrgHospital.xml", FileMode.Truncate, FileAccess.Write))
                {
                    using (XmlWriter x = XmlWriter.Create(fsHosp))
                    {
                        SerializeHospitalData(x, rootElement);

                    }
                }


            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            try
            {
                Import("Hospitals");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

Затем идет метод импорта:

public void Import(string sourceFile)
    {

        IProgressReporter progressReporter = new ProgressReporter();


            BackgroundThreading.RunInBackground<int>((object input) =>
            {


                foreach (IConfigRunner runner in Runners.OrderBy(r => r.Priority))
                {

                    runner.DoImport(progressReporter, sourceFile);

                }
                return 0;
            }, (answer, error, w) =>
                {
                    if (error != null)
                    {
                        //ShowError(error);
                    }
                    else
                    {
                        //AddProgress("Export ready");
                    }
                    //DoReady();
                }, (error) =>
                {
                    //ShowError(error);
                });

    }

Затем выполняется DoImport:

public interface IConfigRunner
{
    int Priority { get; }

    void DoExport(IProgressReporter progress);
    void DoImport(IProgressReporter progress, string filename);
}

[Export]
    public void DoImport(IProgressReporter progress, string filename = null)
    {
if (filename.Equals("Hospitals"))
        {

            if (File.Exists(HOSPITALFILE))
            {
                progress.AddProgress("Importing " + HOSPITALFILE);
                using (OrgEntities orgEntityModel = ModelFactory.GetOrgEntities())
                {
                    Tools.ValidateXml(HOSPITALFILE, "Xsd\\hospital.xsd");
                    XmlSerializer inSerializer = new XmlSerializer(typeof(HospitalRoot));
                    TextReader reader = new StreamReader(HOSPITALFILE);
                    HospitalRoot root = (HospitalRoot)inSerializer.Deserialize(reader);
                    reader.Close();
                    try
                    {
                        OrgHospitalXml.Insert(orgEntityModel, root.Hospitals);
                    }
                    catch (ImportException e)
                    {
                        progress.AddProgress(e.Message + ": " + e.Item);
                        throw e;
                    }
                }
            }

        }

Есть ли способчто я могу показать прогрессию этого в прогрессбар?Или как найти все потоки пользовательского интерфейса?Спасибо заранее

BackgroundWorker:

public static class BackgroundThreading
{
    public static BackgroundWorker RunInBackground<T>(object param, Func<object, T> call, Action<T, Exception, BackgroundWorker> callBack, Action<Exception> errorHandler = null) where T : new()
    {
        BackgroundWorker worker = new BackgroundWorker();
        DoWorkEventHandler workHandler = null;
        RunWorkerCompletedEventHandler completeHandler = null;

        workHandler = delegate(object s, DoWorkEventArgs args)
        {
            args.Result = call(args.Argument);
            args.Cancel = worker.CancellationPending;
        };
        completeHandler = delegate(object s, RunWorkerCompletedEventArgs args)
        {
            if (!args.Cancelled)
            {
                if (args.Error != null)
                {
                    if (!(args.Error is FaultException))
                    {
                        T result = new T();
                        callBack(result, args.Error, (BackgroundWorker)s);
                    }
                    else
                    {
                        if (errorHandler == null)
                        {
                            string message;

                            if (args.Error.InnerException != null)
                            {
                                message = args.Error.InnerException.Message;
                            }
                            else
                            {
                                message = args.Error.Message;

                            }
                            Logger.LogError("SVC", Logger.SVC_ERROR_001, new object[1] { message });
                            throw args.Error;
                        }
                        else
                        {
                            errorHandler(args.Error);
                        }
                    }
                }
                else
                {
                    callBack((T)args.Result, null, (BackgroundWorker)s);
                }
                ((BackgroundWorker)s).DoWork -= workHandler;
                ((BackgroundWorker)s).RunWorkerCompleted -= completeHandler;
            }
        };

        worker.DoWork += workHandler;
        worker.RunWorkerCompleted += completeHandler;
        worker.WorkerSupportsCancellation = true;
        worker.RunWorkerAsync(param);

        return worker;
    }

    public static BackgroundWorker RunInBackground<T>(Func<object, T> call, Action<T, Exception, BackgroundWorker> callBack, Action<Exception> errorHandler = null) where T : new()
    {
        return RunInBackground<T>(null, call, callBack, errorHandler);
    }

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Использовать BackgroundWorker http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Событие ProgressChanged автоматически запускается в потоке пользовательского интерфейса, а фактический код выполняется в другом потоке.

0 голосов
/ 01 апреля 2011

Насколько я помню, вам нужно подключиться к событию с измененным прогрессом и обновить свой индикатор прогресса в этом. Затем вам нужно позвонить worker.reportProgress (x) .

Другой вариант - установить индикатор выполнения на маркер и вызывать Application.DoEvents время от времени, но другие участники могут не одобрить его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...