У меня есть метод с именем 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);
}