2017-01-27 7 views
-1

was mit diesem Code falsch istUmwandlung der Aufgabe in eine erwartete Aufgabe, die einen Rückgabewert liefert?

await Dispatcher.BeginInvoke(new Action(async() => 
         { 
          Task<BitmapImage> x = await Task.Run<Task<BitmapImage>>(async() => await savefile.Set_Image(Ntaban.Api.API_server.Host + "/content/profile/", St_Major.Directories.Directory_Main, lst.First().picAdr)); 
         x.Wait(); 
         imgProfile.Source = x.Result; 
        })); 

und das Verfahren Set_Image ist

public async Task<BitmapImage> Set_Image(string location_in_server, string location_to_save, string name_file) 
    { 
     Ntaban.Api.API_HttpClient apic = new Ntaban.Api.API_HttpClient(); 
     string location = location_to_save + name_file; 
     string location_directory = location_to_save; 
     if (Directory.Exists(location_directory) == false) 
     { 
      Directory.CreateDirectory(location_directory); 
     } 
     if (File.Exists(location) == false) 
     { 
      await apic.download_file_async(location_in_server + name_file, location, null); 
     } 
     BitmapImage s1 = new BitmapImage(); 
     s1.BeginInit(); 
     s1.UriSource = new System.Uri(location_to_save + name_file); 
     s1.EndInit(); 
     return s1; 
    } 

, wenn die Basis nicht stimmt Ich mag Aufgabe haben, aber diese Aufgabe ist awatable. was kann ich tun?

+0

Es gibt keinen Grund zu Rufen Sie 'x.Wait()' oder 'x.Result' von einer Synchronisierungsmethode auf. tue '' erwarten x' stattdessen. –

Antwort

1

Rufen Sie die Freeze() Methode auf dem BitmapImage, die Sie auf dem Hintergrund-Thread zu erstellen, bevor Sie zurückkommen:

public async Task<BitmapImage> Set_Image(string location_in_server, string location_to_save, string name_file) 
{ 
    Ntaban.Api.API_HttpClient apic = new Ntaban.Api.API_HttpClient(); 
    string location = location_to_save + name_file; 
    string location_directory = location_to_save; 
    if (Directory.Exists(location_directory) == false) 
    { 
     Directory.CreateDirectory(location_directory); 
    } 
    if (File.Exists(location) == false) 
    { 
     await apic.download_file_async(location_in_server + name_file, location, null); 
    } 
    BitmapImage s1 = new BitmapImage(); 
    s1.BeginInit(); 
    s1.UriSource = new System.Uri(location_to_save + name_file); 
    s1.EndInit(); 
    s1.Freeze(); 
    return s1; 
} 

Und warten auf die Set_Image Methode in der UI-Anwendung:

public async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    string locationA = Ntaban.Api.API_server.Host + "/content/profile/"; 
    string locationB = St_Major.Directories.Directory_Main; 
    string name = lst.First().picAdr; 
    BitmapImage bitMapImage = await Task.Run(async() => await savefile.Set_Image(locationA, locationB, name)); 
    imgProfile.Source = bitMapImage; 
} 
+0

danke aber was ist einfrieren? –

+0

https://msdn.microsoft.com/en-us/library/ms750509(v=vs.110).aspx – mm8

Verwandte Themen