C# 异步方法返回类型?
这是我正在尝试编写的脚本(使用CodeDomProvider编译和运行) 现在。我希望SendYesNo使用自动resetEvent,因此它会停止脚本执行,直到给出响应为止。一旦设置了响应,也会设置自动重置事件,因此它将继续执行并返回响应。例如,到目前为止我拥有的:C# 异步方法返回类型?,c#,C#,这是我正在尝试编写的脚本(使用CodeDomProvider编译和运行) 现在。我希望SendYesNo使用自动resetEvent,因此它会停止脚本执行,直到给出响应为止。一旦设置了响应,也会设置自动重置事件,因此它将继续执行并返回响应。例如,到目前为止我拥有的: public bool SendYesNo() { this.waitHandle = new AutoResetEvent(false); this.waitHandle.WaitOne()
public bool SendYesNo()
{
this.waitHandle = new AutoResetEvent(false);
this.waitHandle.WaitOne();
return this.Selection;
}
要设置选择,我使用:
public void SetSelection(bool selection)
{
this.Selection = selection;
this.waitHandle.Set();
}
但是,它不起作用(一旦我设置了响应,什么也不会发生),整个程序都被卡住了。没有任何功能。为什么?我想我必须使用async,但我不确定如何使用。另外,我应该为此使用自定义EventHandler吗
谢谢。如果我理解的话,你可能需要这样的东西
private Task<bool> SendYesNo()
{
if (Yes)
{
return true;
}
else
{
return false;
}
}
这实际上比我想象的要简单得多。该框架提供了一个
TaskCompletionSource
类型,它满足您的需要
class NpcScript {
TaskCompletionSource<bool> response = new TaskCompletionSource<bool> ();
public void SetResponse(bool value) {
response.SetResult (value);
}
async Task<bool> SendYesNo() {
return await response.Task;
}
public async Task Perform() {
AddText("Testing. Press yes to continue.");
var answer = await SendYesNo();
if (answer)
{
AddText("Good.");
SendOk();
}
else
{
AddText("Not good.");
SendOk();
}
}
}
显示
SendYesNo()
的代码。如果它的返回类型为void,那么如何将其分配给变量?我不确定我是否理解这个问题-您说希望异步,但希望程序等待响应?这听起来像是您想要一个阻塞操作,即同步。如果您谈论的是wait/async
,异步方法通常返回Task
(在某些特殊情况下为void)。如果你不等待一个异步方法,你可以通过调用任务的Response
属性来得到结果,因为我不知道如何实现这样的事情,所以@MuhammadUmar现在是void的返回类型。我只想知道如何“暂停”脚本(使用async/await),然后将响应应用于调用脚本的变量。我认为您对什么是async/await
有误解(或者至少根据您的问题还不清楚)。确切地但是,我还需要知道在调用SendYesNo方法时如何等待,直到用户设置响应(以及如何设置响应)。例如,一旦调用SendYesNo,它就会停止所有操作。当用户设置响应(使用按钮或代码,无论什么)时,该方法返回该响应,脚本将继续。(还有,如何将bool转换为Task?。@user3265040-当您使用wait
运算符时,“转换”(实际上不是转换)将为您处理<代码>变量应答=等待发送否()
将返回类型为bool
的变量。它相当于var answer=SendYesNo().Result代码>.EDIT:无需更改。但是,当我设置响应时,整个程序似乎停止了(比如,什么也没有发生)。请检查我的编辑。您应该异步调用Perform,但最终需要一些同步点(例如调用Task.Run、Task.Wait)知道它为什么在给出响应后调用SendYesNo两次吗?正如我所测试的,它只调用SendOK一次。您确定代码的其他部分没有进行其他调用吗?
AddText("Testing. Press yes to continue.");
var answer = await SendYesNo();
if (answer)
{
AddText("Good.");
SendOk();
}
else
{
AddText("Not good.");
SendOk();
}
class NpcScript {
TaskCompletionSource<bool> response = new TaskCompletionSource<bool> ();
public void SetResponse(bool value) {
response.SetResult (value);
}
async Task<bool> SendYesNo() {
return await response.Task;
}
public async Task Perform() {
AddText("Testing. Press yes to continue.");
var answer = await SendYesNo();
if (answer)
{
AddText("Good.");
SendOk();
}
else
{
AddText("Not good.");
SendOk();
}
}
}
var script = new NpcScript();
var taskPerform = new Task(async () => {
await script.Perform();
});
taskPerform.Start();
var taskInput = new Task(() =>
//get user input here
script.SetResponse (inp);
});
taskInput.Start();
Task.WaitAll(new Task[] { taskPerform, taskInput });