2016-04-19 18 views
0

Mein Fenster klickt nach dem Klicken auf "Senden". Es sendet Datei und dann sollte es GUI freigeben, aber es tut es nicht. Sehen Sie meinen Code:WPF-Fenster friert ein, nachdem Datei an Dropbox gesendet wurde

private void btn_send_Click(object sender, RoutedEventArgs e) 
    { 
     if (SBox.UploadFile("user", "service", 1, path.Text)) 
      MessageBox.Show("Success"); 
     else 
      MessageBox.Show("Fail, try again"); 
    } 

Dann Code von S-Box-Klasse:

public static bool UploadFile(string user, string service, int orderId, string filepath) 
    { 
     DateTime now = DateTime.Now; 
     dbx = new DropboxClient(login_key); 

     string path = "/Files/" + user + "/" + service + "/order - " + orderId + "/received"; 
     string fileName = now.Year + "" + now.ToString("MM") + "" + now.ToString("dd") + "" + Path.GetExtension(filepath); 

     Task upl = Upload(dbx, path, fileName, File.ReadAllBytes(filepath)); //send file 
     upl.Wait(); 

     return true; 
    } 

und Aufgabencode:

static async Task Upload(DropboxClient dbx, string folder, string file, byte[] content) 
    { 
     using (var mem = new MemoryStream(content)) 
     { 
      var updated = await dbx.Files.UploadAsync(
       folder + "/" + file, 
       WriteMode.Overwrite.Instance, 
       body: mem); 
      Console.WriteLine("Saved {0}/{1} rev {2}", folder, file, updated.Rev); 
     } 
    } 

wie gesagt, ist Aktenordner zu korrigieren senden aber GUI friert. Die Konsolen-App funktioniert perfekt und schreibt beim Erfolg die Ausgabe.

Antwort

0

ich mit ihm ein wenig gespielt haben und tat so ich forsche. Hier ist mein letzter Arbeits Code Button:

private async void btn_send_Click(object sender, RoutedEventArgs e) 
    { 
     SBox sbox = new SBox(); 
     progress.Text = "Uploading file, please wait..."; 
     bool t = await sbox.UploadFromGUI("user", "service", 1, path.Text); 
     progress.Text = ""; 
     if (t == true) 
      MessageBox.Show("Success!", "Info", MessageBoxButton.OK, MessageBoxImage.Information); 
     else 
      MessageBox.Show("Failed", "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 

und Verfahren in SBox Klasse:

public async Task<bool> UploadFromGUI(string user, string service, int orderId, string filepath) 
    { 
     DateTime now = DateTime.Now; 
     dbx = new DropboxClient(login_key); 

     string path = "/files/" + user + "/" + service + "/order - " + orderId + "/received"; 
     string fileName = now.Year + "" + now.ToString("MM") + "" + now.ToString("dd") + "" + Path.GetExtension(filepath); 

     try 
     { 
      using (var mem = new MemoryStream(File.ReadAllBytes(filepath))) 
      { 
       var updated = await dbx.Files.UploadAsync(
        path + "/" + fileName, 
        WriteMode.Overwrite.Instance, 
        body: mem); 
       return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
    } 
1

Du Task.Wait() mit upl.Wait();

Dies verursacht den aktuellen Thread mit laufen und zu warten, bis die Aufgabe, bevor Sie fortfahren abgeschlossen hat.

Edit:

Wenn Sie mehr als das einzige Methode tun wollen (andere Aktionen nach Abschluss ausführen) habe ich immer Aufgaben wie diese mit Task.Run() verwendet haben:

Task.Run(() => 
{ 
    Upload(...); 
    OnCompletion(); 
} 

und wenn Sie wollen UI Sachen tun, vergessen sie nicht auf dem Dispatch Thread zu nennen:

Task.Run(() => 
{ 
    Upload(...); 
    Dispatcher.BeginInvoke(new Action(() => { 
     OnCompletion(); 
    }; 
} 
+0

Run() nicht tritt als Methode. Ich habe gerade upl.Wait() gelöscht und es funktioniert, das Problem ist, weiß nicht, wann das Hochladen der Datei abgeschlossen ist. – arti

+0

Ah, mein Fehler. Ich habe immer Task.Run (Methode) verwendet, aber es ist eigentlich eine statische Methode. https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.run(v=vs.110).aspx – Joe

+0

Sie wissen, wenn es fertig ist, schreiben Sie in die Konsole "Gespeichert. .. " – Joe