Új hozzászólás Aktív témák

  • ubid

    senior tag

    Sziasztok !

    Egy excel importert kell írnom silverlight alatt.
    Elegáns megoldásként úgy gondoltam, hogy mivel 4000 soros excel állományokról van szó, amiknek a felolvasása több időt vesz igénybe, hogy háttér szálon olvasson a UI fagyása nélkül.

    BackgroundWorkerrel szerettem volna megoldani, azonban abba a hibába ütköztem, hogy Invalid cross-thread access hibát dob.

    Egy gomb eseménye a fájl betallózása :
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "Excel workbook (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|All files|*.*";
    openFileDialog.ShowDialog();

    FileInfo fileInfo = openFileDialog.File;

    if (fileInfo != null)
    {
    tbMessages.Text = "The processing may take several minutes. Please wait...\n";
    btnImporter.IsEnabled = false;
    DoBackGroundWork(fileInfo);

    }

    A DoBackGroundWork metódusom így néz ki :

    private void DoBackGroundWork(FileInfo f)
    {
    BackgroundWorker worker = new BackgroundWorker();
    fileNameProperty = f;
    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.RunWorkerAsync();
    }

    A lényeg pedig a DoWork eseménybe van :

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker worker = sender as BackgroundWorker;
    int totalSteps = 30;

    ProcessExcelSheet(fileNameProperty);

    }

    }

    Ebbe pedig az excel kezelést ez végzi : ProcessExcelSheet(fileNameProperty);
    A filNameProperty egy FileInfo-t tartalmaz, amire szükség van az excel megnyitásánál.

    Amikor ebbe a függvénybe meg szeretném nyitni az excel-t :
    dynamic workbook = excel.Workbooks.Open(File.FullName);

    Akkor kapom a hibát.

    Amíg ez a hosszú művelet futna egy progress baron szeretném kijeleztetni hogy éppen hol tartunk, valamint ne faggyon ugye a UI.

    Hogyan tudnám ezt megoldani ha nem így ? ?

Új hozzászólás Aktív témák

Hirdetés