Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步任务如何有条件地返回_C#_Azure_Asynchronous - Fatal编程技术网

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。这可能会中断服务的现有调用方。