2017-03-04 10 views
0

저는 C#을 처음 사용하고 imgurAPI를 사용하여 앱을 만들고 있습니다. 이미지를 업로드하려고하는데 파일을 읽는 동안 문제가있는 것으로 보입니다. 정말로 무엇을 해야할지 모르겠다. (오류는 Oauth 또는 액세스 토큰 등에서 오지 않음)imgur에서 이미지를 C# UWP로 업로드하려고 시도했습니다.

다음은 내가 사용하는 기능입니다. 첫 번째 것은 업로드 버튼을 클릭 할 때 호출되는 것입니다.

예외가 발생 : 'System.InvalidOperationException'을 System.IO.FileSystem.dll System.InvalidOperationException에 : 여기 _

public async Task UploadImage() 
    { 
     Debug.WriteLine("UPLOADIMAGE"); 
     try 
     { 
      if (_path != null) 
      { 
       Debug.WriteLine("String to upload " + _path); 
       //_path is ok here, form is   "C:\Users\MyName\Pictures\1412091183-dreamfall-chapters.jpg" 

       var endpoint = new ImageEndpoint(SimpleIoc.Default.GetInstance<ImgurApi>()._Client); 
       try 
       { 
        var file = File.ReadAllBytes(_path); 
        var image = await endpoint.UploadImageBinaryAsync(file); 
       } 
       catch (Exception message) 
       { 
        Debug.WriteLine(message); 
       } 

      } 
     } 
     catch (Imgur.API.ImgurException imgurEx) 
     { 
      Debug.Write("An error occurred uploading an image to Imgur."); 
      Debug.Write(imgurEx.Message); 
     } 
    } 

public async void FileNameButton_Click() 
    { 
     try 
     { 
      Debug.WriteLine("ICI"); 
      FileOpenPicker fileOpenPicker = new FileOpenPicker(); 
      fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 
      fileOpenPicker.ViewMode = PickerViewMode.Thumbnail; 
      fileOpenPicker.FileTypeFilter.Add(".png"); 
      fileOpenPicker.FileTypeFilter.Add(".jpeg"); 
      fileOpenPicker.FileTypeFilter.Add(".jpg"); 
      fileOpenPicker.FileTypeFilter.Add(".gif"); 

      StorageFile file = await fileOpenPicker.PickSingleFileAsync(); 
      if (file != null) 
      { 

       _path = file.Path; 
       await UploadImage(); 
       Debug.WriteLine(file.Path); 
      } 
     } 
     catch (Exception exception) 
     { 
      Debug.WriteLine(exception.Message); 
     } 
    } 

내가 얻을 오류입니다 동기 UI 스레드에서 작업을 수행하면 안됩니다. 이 Task.Run에이 메서드를 래핑합니다. System.IO.FileStream에서 System.IO.WinRTFileSystem.Open에서 System.IO.WinRTFileSystem.EnsureBackgroundThread() (문자열 fullpath에, 대한 fileMode 모드, FileAccess 액세스, 파일 공유 점유율, INT32 버퍼 크기, FileOptions 옵션, 파일 스트림 부모)에서 .Init (문자열 경로, 대한 fileMode 모드, FileAccess 액세스, 파일 공유 공유, INT32 BUFFERSIZE, FileOptions 옵션) Epicture.ViewModels.MainPageVm.d__19.MoveNext에서 System.IO.File.InternalReadAllBytes (문자열 경로)에서() C : \ Users \ Bandini \ Pictures \ 1412091183-dreamfall-chapters.jpg

미리 감사드립니다.

+1

당신이 'Task.Run에서이 방법을 포장을 고려해'있다? 기본 UI 스레드를 잠그고 있기 때문에 이음새가 없어집니다. 하지 말아야 할 2 가지 가장 중요한 규칙 중 하나입니다. – Stralos

+0

아니요, Task.Run에서이 메서드를 래핑하는 것이 무슨 뜻인지 이해하지 못합니다. 다른 규칙은 뭐니? – Bandini

+0

나는 Task.Run (() => UploadImage())을 기다렸다. 이것은 작업 랩핑을위한 좋은 방법입니까? 그것은 일을하는 것처럼 보입니다. 이제는 저의 경로에서 접근이 거부되었습니다. – Bandini

답변

0

동기 호출이고 UI 스레드를 차단하는 File.ReadAllBytes을 사용하고 있습니다.

당신은 이것을 위해 aync IO API를 사용해야합니다.

또한 ImageEndpoint에는 스트림을 받아들이는 메소드가 있습니다. 이는 바람직합니다.

예 :

using(var file = File.OpenRead(_path)) 
{ 
    var image = await endpoint.UploadImageStreamAsync(file); 
}