[C#] WinRT에서 File Exists Converter를 만드는 방법


Answers

IfFileExist 메서드가 IfFileExist 으로 실행되는 것을 원하지 않는다고 생각합니다. 그러나 그것은 await 의 사용 때문에 일어나는 일입니다.

이것을 다음과 같이 변경하십시오.

public async Task<System.Collections.Generic.IReadOnlyList<Windows.Storage.StorageFile>> GetFilesAsync()
{
    var folder = ApplicationData.Current.LocalFolder;
    return await folder.GetFilesAsync(CommonFileQuery.OrderByName)
                       .AsTask().ConfigureAwait(false);
}

public string IfFileExist(string value, string filename)   
{   
    var files = GetFilesAsync().Result;

    var file = files.FirstOrDefault(x => x.Name == filename);   
    if (file != null)   
    {   
        return "ms-appdata:///local/" + filename;   
    }   
    return value;   
}

await 를 사용하는 대신 GetFilesAsync 에서 반환하는 작업의 Result 속성에 액세스하여 작업이 끝날 때까지 메서드를 차단합니다.

원래 코드는 다음과 유사합니다.

public async Task<string> IfFileExist(string value, string filename) 
{ 
    var folder = ApplicationData.Current.LocalFolder; 
    var getFilesAsync = folder.GetFilesAsync(CommonFileQuery.OrderByName); 

    return getFilesAsync.ContinueWith(z => 
    {
        var file = getFilesAsync.FirstOrDefault(x => x.Name == filename); 
        if (file != null) 
        { 
            return "ms-appdata:///local/" + filename; 
        } 
        return (string)value; 
    }
} 
Question

로컬 저장소에 이미지 소스가있는 경우 변환기로 확인하려고합니다. 외부 URL로 이동하지 않는 경우.

<Image Source="{Binding Image, Converter={StaticResource ImageCacheConverter}}"/>

이것은 지금까지 내 변환기입니다.

public object Convert(object value, Type targetType, object parameter, string language)
{
    return IfFileExist((string)value, "localimage.png");
}
public async Task<string> IfFileExist(string value, string filename)
{
    var folder = ApplicationData.Current.LocalFolder;
    var getFilesAsync = await folder.GetFilesAsync(CommonFileQuery.OrderByName);

    var file = getFilesAsync.FirstOrDefault(x => x.Name == filename);
    if (file != null)
    {
        return "ms-appdata:///local/" + filename;
    }
    return (string)value;
}

내가 직면하고있는 주요 문제는 IValueConverter 내부에 비동기가 있다는 것입니다. 하지만 이미지 소스를 변경하려면 IfFileExist를 반환해야합니다.

미리 감사드립니다.




핵심 문제는 동기 작업 ( Convert ) 내에서 async 작업을 수행해야한다는 것입니다. 이 작업을 수행하는 쉬운 방법은 없습니다. 가능한 경우 코드가 필요하지 않도록 구조화하십시오 (예 : "변환"의 결과 인 다른 속성에 대한 async 업데이트를 한 속성에서 시작하도록).

강제로 적용하려면 ConfigureAwait(false) 를 사용해야합니다.

public object Convert(object value, Type targetType, object parameter, string language)
{
  // Note that "Result" will wrap any errors in AggregateException, which is annoying.
  return IfFileExist((string)value, "localimage.png").Result;
}

public async Task<string> IfFileExist(string value, string filename)
{
  var folder = ApplicationData.Current.LocalFolder;
  var getFilesAsync = await folder.GetFilesAsync(CommonFileQuery.OrderByName)
      .AsTask().ConfigureAwait(false);

  var file = getFilesAsync.FirstOrDefault(x => x.Name == filename);
  if (file != null)
  {
    return "ms-appdata:///local/" + filename;
  }
  return (string)value;
}



Windows 8이 나에게 가까이 있지는 않지만 다음 코드를 시도해보십시오 (메서드 본문 만 Convert ).

public object Convert(object value, Type targetType, object parameter, string language)   
{
    string result = string.Empty;
    Task.Run(async delegate
    {
        result = await IfFileExist((string)value, "localimage.png");
    }).Wait();

    return result;
}

그러나 그것이 작동하는지 나는 확실하지 않다.