2011-04-01 36 views
0

我有一種稱爲Import的方法,將xml文件的數據導入到數據庫中。它看起來像這樣:當我將數據導入到數據庫中時,想要在C#中的進度條中設置UI線程

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

     } 

有沒有什麼辦法,我可以告訴進展這是在進度欄?或者如何找到所有的UI線程? THX提前

的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); 
    } 

回答

0

據我記得你需要連接到progress changed event並更新你的進度條。 然後您需要致電worker.reportProgress(x)

另一種選擇是你的進度條設置爲勞斯萊斯並調用Application.DoEvents飄飛,但是這很可能是由其他成員

相關問題