当前位置: 首页 > 知识库问答 >
问题:

使用 await 和 async 返回字符串列表

巩才捷
2023-03-14

> < li >我在组织的租户azure环境中部署了一个ASP.NET(4.5)网站。 < li >它具有从网络位置(我们称之为nas驱动器)上传/下载/删除文件(任何类型)的功能,例如\nas8782\xyz\abc\ < li>

上传/下载/删除工作正常(参见下面的代码)。我们用的是CloudSdk。由我们的Azure团队创建的Azure库。

  • nasClient.UploadAsync
  • nasClient.DownloadAsync
  • nasClient.DeleteAsync
  • nasClient.ListFilesAsync

文件服务.cs

using CloudSdk.Azure;

private string userId = ConfigurationManager.AppSettings["userId"].ToString();
    private string userPassword = ConfigurationManager.AppSettings["userPassword"].ToString();
    private string baseNasLocation = ConfigurationManager.AppSettings["baseNasLocation"].ToString();
    string env = ConfigurationManager.AppSettings["env"].ToString().ToUpper();

public async Task Upload(string fileName, string fileToSave, string projectID)
    {
        var nasClient = new NasClient(userId, userPassword);
        var localFiles = new List<string>();
        localFiles.Add(fileToSave);
        await nasClient.UploadAsync(baseNasLocation + env + @"\" + projectID + @"\", localFiles);
}
public async Task Download(string fileToDownload, string projectID)
    {
        var nasClient = new NasClient(userId, userPassword);
        Stream stream2 = nasClient.DownloadAsync(baseNasLocation + env + @"\" + projectID + @"\" + fileToDownload).Result;
        var appPath2 = HostingEnvironment.MapPath("~\\TempUpload");
        var localFullPath2 = string.Format("{0}\\{1}", appPath2, fileToDownload);
        using (var fileStream2 = System.IO.File.Create(localFullPath2))
        {
            stream2.CopyTo(fileStream2);
        }
}


 public async Task Delete(string fileToDelete, string projectID)
    {
        var nasClient = new NasClient(userId, userPassword);
        Task stream2 = nasClient.DeleteAsync(baseNasLocation + env + @"\" + projectID + @"\" + fileToDelete);
}

我从default.aspx调用这些函数。cs页面

private void Download(string fileName)
    {
        FileService fObj = new FileService();
        var task = Task.Run(async () => { await fObj.Download(fileName, projectId.ToString()); });
        task.Wait();
    }
 private void Delete(string fileName)
    {
        FileService fObj = new FileService();
        var task = Task.Run(async () => { await fObj.Delete(fileName, projectId.ToString()); });
        task.Wait();
    }
private void Upload(string fileName, string fileToSave)
    {
        FileService fObj = new FileService();
  var task = Task.Run(async () => { await fObj.Upload(fileName, fileToSave, projectId.ToString()); });
        task.Wait();
    }

问题

-这个CloudSdk. Azure库有另一个函数调用ListFilesAsync,它获取提供的路径中存在的所有文件的列表。

我正在使用下面的代码来做同样的事情,但无法得到它。

如果我调用此文件服务方法

没有异步和等待-它运行但一直运行并且从不返回结果。

public  Task<string> ListFileNames(string projectID)
        {
            var nasClient = new NasClient(userId, userPassword);
            string nasPath = baseNasLocation + env + @"\" + projectID + @"\"; 

            var content =  nasClient.ListFilesAsync(nasPath).Result;
            //return content;
            return JsonConvert.DeserializeObject <Task<string>> (content); 
        }

使用Async和await -它抛出编译错误

 public async Task<string> ListFileNames(string projectID)
        {
            var nasClient = new NasClient(userId, userPassword);
            string nasPath = baseNasLocation + env + @"\" + projectID + @"\"; 

            var content = await nasClient.ListFilesAsync(nasPath).Result;
            //return content;
            return JsonConvert.DeserializeObject <Task<string>> (content); 
        }

我如何从aspx.cs页面调用此方法

  var task = Task.Run(async () => { await fObj.ListFileNames(projectId.ToString()); });
        task.Wait();

抱歉问了这么长的问题,我只想尽可能多地描述。我对这个等待和异步很陌生,真的很感谢所有的帮助。

共有2个答案

穆华彩
2023-03-14

您可以使用任务。结果以同步方式获取任务的结果。

string result=任务.result;

此外,您不应该使用JsonConvert。反序列化对象以创建Task。我不确定你想在那里做什么。您可以使用允许动态访问的JObject。

胡国兴
2023-03-14

以下是您的实施:

  public async Task<string> ListFileNames(string projectID)
    {
        var nasClient = new NasClient(userId, userPassword);
        string nasPath = baseNasLocation + env + @"\" + projectID + @"\"; 

        return await nasClient.ListFilesAsync(nasPath);
    }
  • 无调用等待调用中的结果
  • 没有对任务进行反序列化

异步Await的工作方式是真正的基于异步/ IO的操作,它将释放调用上下文,而操作在后台进行,从而提高系统的可扩展性。

 类似资料:
  • 编辑:在测试用例5中,任务似乎处于状态。 我在.NET 4.5中使用System.net.http.HttpClient时遇到了一些奇怪的行为--其中“等待”调用的结果(例如)将永远不会返回。 只有在使用新的Async/Await语言功能和任务API的特定情况下才会出现这种情况--代码似乎总是在只使用延续时工作。

  • 问题内容: 为了熟悉,我在Chrome中尝试了以下代码: 但不保存结果(字符串);而是持有一个需要再次等待的。这段代码确实给了我响应字符串: 如何使用await从函数返回实际的响应字符串? 问题答案: 要么 要么 这只是编写相同逻辑的另一种方法。

  • 它会返回我想要的结果。我还从https://stackoverflow.com/a/25899982/9367841尝试了这个 但不管用。

  • 问题内容: 我尝试将Jersey中的字符串列表作为JSON和XML返回。我认为这将是微不足道的。 我的第一次尝试是写这样的东西 而且我期望输出与此类似:[“ string1”,…,“ stringN]不幸的是,我得到了这个: 然后我为列表写了一个包装StringString 并将外观修改为 这对于包含超过1个项目的列表非常有用。 不幸的是,对于一个或零个元素,我得到了两个意外的结果 我做错什么了吗

  • 所以我一直很高兴地使用async/await,因为Firebase云函数支持节点8。不过我有一件事要做。当使用可调用函数时,会告诉您必须在函数中返回promise,否则它将无法正常工作。当使用原始promise时,我很清楚如何使用它: 但是现在,随着异步等待,我不确定如何返回这个“promise链”: 有人知道吗?

  • Then Peter came to him and said,"Lord, how many times must I forgive my brother who sins against me? As many as seven times?" Jesus said to him,"Not seven times, I tell you, but seventy-seven times?"