C# 异步方法返回类型?

C# 异步方法返回类型?,c#,C#,这是我正在尝试编写的脚本(使用CodeDomProvider编译和运行) 现在。我希望SendYesNo使用自动resetEvent,因此它会停止脚本执行,直到给出响应为止。一旦设置了响应,也会设置自动重置事件,因此它将继续执行并返回响应。例如,到目前为止我拥有的: public bool SendYesNo() { this.waitHandle = new AutoResetEvent(false); this.waitHandle.WaitOne()

这是我正在尝试编写的脚本(使用CodeDomProvider编译和运行)

现在。我希望SendYesNo使用自动resetEvent,因此它会停止脚本执行,直到给出响应为止。一旦设置了响应,也会设置自动重置事件,因此它将继续执行并返回响应。例如,到目前为止我拥有的:

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 });