> < li >我在组织的租户azure环境中部署了一个ASP.NET(4.5)网站。 < li >它具有从网络位置(我们称之为nas驱动器)上传/下载/删除文件(任何类型)的功能,例如\nas8782\xyz\abc\ < li>
上传/下载/删除工作正常(参见下面的代码)。我们用的是CloudSdk。由我们的Azure团队创建的Azure库。
文件服务.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();
抱歉问了这么长的问题,我只想尽可能多地描述。我对这个等待和异步很陌生,真的很感谢所有的帮助。
您可以使用任务。结果以同步方式获取任务的结果。
string result=任务.result;
此外,您不应该使用JsonConvert。反序列化对象以创建Task。我不确定你想在那里做什么。您可以使用允许动态访问的JObject。
以下是您的实施:
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?"