【问题标题】:UWP C# TryGetItemAsync - call hangs third timeUWP C# TryGetItemAsync - 呼叫第三次挂起
【发布时间】:2018-08-12 16:49:53
【问题描述】:

我在开发 UWP 应用和使用 await/async 方面非常陌生。我尝试从 UWP 应用程序的本地文件夹中获取文件,但该应用程序挂起。该文件存在于驱动器上。

我写了一些测试方法来尝试找出问题,但我不明白,为什么它不起作用。两次运行正常,第三次总是挂起。

有人知道我在做什么吗?

代码:

    public void Test()
    {
        for (var i = 0; i < 10; i++)
        {
            KLogger.Log.Debug("");
            KLogger.Log.Debug("### Started : " + i);

            // create new or returns existent file
            var task = TestGetNewFile("test.txt");
            //task.ConfigureAwait(false);
            task.Wait();
            var res = task.Result;

            task.Dispose();

            KLogger.Log.Debug("### Done : " + i);
        }
    }

    public async Task<IStorageFile> TestGetNewFile(string fileName)
    {
        var storageFolder = ApplicationData.Current.LocalFolder;

        KLogger.Log.Debug("Creation started.");

        var fileItem = await storageFolder.TryGetItemAsync(fileName);

        KLogger.Log.Debug("Creation finished.");

        return null;
    }

日志输出:

2018-08-12 00:41:07.282 +02:00 [DBG] 
2018-08-12 00:41:07.282 +02:00 [DBG] ### Started : 0
2018-08-12 00:41:07.284 +02:00 [DBG] Creation started.
2018-08-12 00:41:07.289 +02:00 [DBG] Creation finished.
2018-08-12 00:41:07.289 +02:00 [DBG] ### Done : 0
2018-08-12 00:41:07.289 +02:00 [DBG] 
2018-08-12 00:41:07.289 +02:00 [DBG] ### Started : 1
2018-08-12 00:41:07.289 +02:00 [DBG] Creation started.
2018-08-12 00:41:07.300 +02:00 [DBG] Creation finished.
2018-08-12 00:41:07.300 +02:00 [DBG] ### Done : 1
2018-08-12 00:41:07.300 +02:00 [DBG] 
2018-08-12 00:41:07.300 +02:00 [DBG] ### Started : 2
2018-08-12 00:41:07.300 +02:00 [DBG] Creation started.
-- nothing more in log file --

【问题讨论】:

  • 您的代码无法编译。 Task 类中没有 Dispose 方法。
  • // 组装位置:C:\Users\user\.nuget\packages\microsoft.netcore.universalwindowsplatform\6.1.5\ref\uap10.0.15138\System.Runtime.dll - 任务有一个处置方法。但是您可以删除 Dispose 调用。这只是一个测试。没有处理,问题是一样的。UWP 应用程序适用于目标平台 Windows 10,版本 1803 (10.0; Build 17134) 最小。版本 Windows 10 Fall Creators Update (10.0; Build 16xxx)
  • 如果您从 UI 线程调用此代码,那么令人惊讶的是它在前两次工作,这是一种已知的死锁模式。尝试像这样调用您的方法:var task = Task.Run(() =&gt; TestGetNewFile("test.txt"));

标签: c# file uwp async-await


【解决方案1】:

如果你这样称呼它就可以了,一直使用async-await

private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        var item = await TestGetNewFile("test.txt"); 
    }
}

async Task<IStorageItem> TestGetNewFile(string fileName)
{
     return await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName);         
}

您可能会发现这个答案await vs. Task.Wait - Deadlock? 很有用。

【讨论】:

  • 嘿!伟大的!现在,这与“async-await all way down”完美结合。非常感谢您的快速帮助!
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多