C# 异步任务如何有条件地返回
我试图有条件地返回异步方法任务。下面是我尝试的方式C# 异步任务如何有条件地返回,c#,azure,asynchronous,C#,Azure,Asynchronous,我试图有条件地返回异步方法任务。下面是我尝试的方式 public string DoMessage(MyObj obj) { string returnStatus = "Processing..."; var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; var queueClient = storageAccount.CreateCloudQueueCli
public string DoMessage(MyObj obj)
{
string returnStatus = "Processing...";
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var queueClient = storageAccount.CreateCloudQueueClient();
var queue = queueClient.GetQueueReference(ConfigurationManager.AppSettings["QueueName"]);
if (queue.CreateIfNotExists()) {
}
var msg = CloudQueueMessageExtensions.Serialize(obj);
queue.AddMessage(msg);
//Task processTask = RunMessageProces();
var t = Task.Run(() => RunMessageProces());
t.Wait();
return returnStatus;
}
private async Task<string> RunMessageProces()
{
statusProcess = "Your message successfully inserted in process queue.";
await Task.Run(() => {
lock (_oQueue)
{
if (flagProcessing == true) //return when queue processing alredy started
{
return statusProcess; //Error ..??? how to return
}
flagProcessing = true; //else start processing the queue till there are messages.
}
});
statusProcess = ProcessMyMessage();
return statusProcess;
}
private string ProcessMyMessage() {...}
publicstringdomessage(MyObj obj)
{
字符串returnStatus=“正在处理…”;
var storageAccount=CloudStorageAccount.DevelopmentStorageAccount;
var queueClient=storageAccount.CreateCloudQueueClient();
var queue=queueClient.GetQueueReference(ConfigurationManager.AppSettings[“QueueName”]);
if(queue.CreateIfNotExists()){
}
var msg=CloudQueueMessageExtensions.Serialize(obj);
queue.AddMessage(msg);
//Task processTask=RunMessageProces();
var t=Task.Run(()=>RunMessageProces());
t、 等待();
返回状态;
}
专用异步任务RunMessageProces()
{
statusProcess=“您的邮件已成功插入流程队列。”;
等待任务。运行(()=>{
锁
{
if(flagProcessing==true)//队列处理开始时返回
{
return statusProcess;//错误..???如何返回
}
flagProcessing=true;//否则开始处理队列,直到有消息为止。
}
});
statusProcess=ProcessMyMessage();
返回状态处理;
}
私有字符串ProcessMyMessage(){…}
我错过了什么?如何在异步方法下有条件地返回中间的字符串,该方法也位于等待锁匿名块(?)中。我在任务中执行异步,因为由于服务的公开部分,do消息会同时被大量调用淹没。我假设您正在询问如何访问任务返回的值
private async Task<string> RunMessageProces()
{
var statusProcess = "Your message successfully inserted in process queue.";
var retValue = await Task.Run(() =>
{
lock (_oQueue)
{
if (flagProcessing == true) //return when queue processing alredy started
{
return "Error"; // or some such error indicator
}
flagProcessing = true; //else start processing the queue till there are messages.
}
return string.Empty; // return a string here too....
});
// if( retValue == "Error" ) { return "Error" }
statusProcess = ProcessMyMessage();
return statusProcess;
}
private异步任务RunMessageProces()
{
var statusProcess=“您的邮件已成功插入流程队列。”;
var retValue=等待任务。运行(()=>
{
锁
{
if(flagProcessing==true)//队列处理开始时返回
{
返回“Error”;//或类似的错误指示器
}
flagProcessing=true;//否则开始处理队列,直到有消息为止。
}
return string.Empty;//在此处也返回一个字符串。。。。
});
//如果(retValue==“Error”){return“Error”}
statusProcess=ProcessMyMessage();
返回状态处理;
}
Hy,请给出一个最小的运行示例,我们可以试试看吗?这里是..公共字符串DoMessage(){var t=Task.Run(()=>RunMessageProces();}私有异步任务RunMessageProces()//异步任务{statusProcess=“MSG.”等待任务。运行(()=>{//这里的第一个错误…锁({u oQueue){if(flagProcessing==true){return statusProcess;//此处出现第二个错误。}flagProcessing=true;//否则开始处理队列直到有消息。}}});statusProcess=BigTimeConsumingProcess();return statusProcess;}Hi-shr,请注意,锁内的返回给出了错误。第一个是等待任务。运行语句“并非所有代码路径都在lambda表达式中返回'System.Func'类型的值”(我不要求总是返回,但有条件返回),第二个错误是返回'error'语句“无法将类型字符串隐式转换为System.Threading.Tasks.Task。”@AKS,它对我有效。若要修复第一个错误,您需要在锁定块或if块之后返回字符串。我有一个返回字符串。代码中为空。粘贴更新的代码,以便我可以查看。谢谢shr,我得到了它,错误地假设返回”错误";inside lock从函数RunMessageProces返回,但实际上是返回到任务。仅运行。您的额外代码(如var retValue=和上次注释的检查)打开了知识之门。非常感谢。@AKS,另一方面,您不需要额外的任务来调用RunMessageProces。您可以var t=等待RunMessageProcess()感谢var t=await RunMessageProcess();但要做到这一点,需要更改此行存在的方法,这是一个WCF公开的方法/约定,在它前面附加async以允许wait。这可能会中断服务的现有调用方。