C# 检查是从void方法完成的,不可能返回

C# 检查是从void方法完成的,不可能返回,c#,async-await,C#,Async Await,我正在尝试了解async和wait我一直在尝试在我的一些代码中实现它,到目前为止我已经做了: 代码: public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project) { try { string macroSelected = _macroModeT

我正在尝试了解
async
wait
我一直在尝试在我的一些代码中实现它,到目前为止我已经做了:

代码:

        public async Task ExcecuteMacroCode(string _macroModeToUse, string[] _macroCode, string _site, Project _project)
        {
            try {
                string macroSelected = _macroModeToUse == "-[REG]" ? "-[REG]" : "-[LAP]";
                if (_macroModeToUse == macroSelected)
                {
                    foreach (string _macroCodeFile in _macroCode)
                    {
                        string[] code = _macroCodeFile.Split('|');

                        switch (code[0])
                        {
                            case "RJ_U":
                                string cleanUrl = code[1].Replace("{HOSTNAME}", _site);
                                browser.Load(cleanUrl);
                                panelBrowserMain.Controls.Add(browser);
                                browser.Dock = DockStyle.Fill;
                                browserMain.Text = cleanUrl;
                                browser.AddressChanged += Browser_AddressChanged;
                                break;
                            case "RJ_I":
                                //await Task.Run(() => {
                                //    return browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
                                //});
                                browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(code[1], _project));
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }

        public async Task InitializeChromeBrowserAsync(ChromiumWebBrowser browser, string _macroModeToUse, string[] _macroCode, string _site, int _sitesCount, Project _project, Func<string, Tuple<string, string, string>> getUserPassEmail)
        {
            try
            {
                Task newTask = await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
                if (newTask.IsCompleted)
                {
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
            }
        }
public async Task ExcecuteMacroCode(string\u macromodeouse,string[]\u macroCode,string\u site,Project\u Project)
{
试一试{
字符串宏选择=_macroModeToUse==“-[REG]”?“-[REG]”:“-[LAP]”;
如果(_macroModeToUse==选择的宏)
{
foreach(字符串\u宏代码中的宏代码文件)
{
string[]code=_macroCodeFile.Split(“|”);
开关(代码[0])
{
案例“RJ_”:
字符串cleanUrl=代码[1]。替换(“{HOSTNAME}”,_站点);
browser.Load(cleanUrl);
panelBrowserMain.Controls.Add(浏览器);
browser.Dock=DockStyle.Fill;
Text=cleanUrl;
browser.AddressChanged+=浏览器\地址已更改;
打破
案例“RJ_I”:
//等待任务。运行(()=>{
//返回browser.ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(代码[1],_项目));
//});
ExecuteScriptAsyncWhenPageLoaded(GetAndReplaceMacro(代码[1],_项目));
打破
}
}
}
}
捕获(例外情况除外)
{
DebugLogging($“[{DateTime.Now}]-[{ex}]”;
}
}
公共异步任务初始化RomeBrowserAsync(ChromiumWebBrowser浏览器、字符串_Macromodeouse、字符串【】宏代码、字符串_站点、int _站点、项目_项目、Func getUserPassEmail)
{
尝试
{
Task newTask=wait ExcecuteMacroCode(\u宏模式,\u宏代码,\u站点,\u项目);
如果(newTask.IsCompleted)
{
这个。关闭();
}
}
捕获(例外情况除外)
{
DebugLogging($“[{DateTime.Now}]-[{ex}]”;
}
}
我刚才设置它的方式得到了错误
无法将类型'void'隐式转换为'System.Threading.Tasks.Task'
,据我所知,这是因为
方法wait ExcecuteMacroCode
没有返回任何内容(没错,我真的不需要返回任何内容)


有什么方法可以确保任务完成,这样我就可以使用
新任务。IsCompleted
部分,我甚至不确定我是否正确设置了代码。希望您能提供帮助。

您无需手动检查等待的任务是否完成。等待接线员已经完成了

错误是此调用
正在等待\u wellboreService.CreateWellboreSectionAsync(wellboreSection,CurrentUser)
返回
void
,您正试图将其分配给
任务newTask

当您等待任务时,该方法将挂起,并将控制权交给父调用方,直到任务完成,然后自动恢复。在await语句之后,您知道任务实际上已经完成,因为如果不完成,您就不会到达执行中的那一行。因此,不需要手动检查任务的
IsCompleted
属性。

您可以像这样重写代码:

try
{
    await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
    this.Close();
}
catch (Exception ex)
{
    Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
}
您应该查看更多说明和示例,例如:

public async Task<int> GetUrlContentLengthAsync()
{
    var client = new HttpClient();

    Task<string> getStringTask =
        client.GetStringAsync("https://docs.microsoft.com/dotnet");

    DoIndependentWork();

    string contents = await getStringTask;

    return contents.Length;
}

void DoIndependentWork()
{
    Console.WriteLine("Working...");
}
公共异步任务GetUrlContentLengthAsync() { var client=新的HttpClient(); 任务getStringTask= client.GetStringAsync(“https://docs.microsoft.com/dotnet"); 做独立的工作(); 字符串内容=等待getStringTask; 返回内容。长度; } void DoIndependentWork() { 控制台。WriteLine(“工作…”); } 密切注意等待接线员。它挂起
GetUrlContentLengthAsync

  • GetUrlContentLengthAsync
    getStringTask
    完成了
  • 同时,控件返回给的调用方
    GetUrlContentLengthAsync
  • 控制将在以下时间恢复:
    getStringTask
    已完成
  • 然后,
    wait
    操作符检索 字符串结果来自
    getStringTask

  • 您不需要手动检查等待的任务是否已完成。等待接线员已经完成了

    错误是此调用
    正在等待\u wellboreService.CreateWellboreSectionAsync(wellboreSection,CurrentUser)
    返回
    void
    ,您正试图将其分配给
    任务newTask

    当您等待任务时,该方法将挂起,并将控制权交给父调用方,直到任务完成,然后自动恢复。在await语句之后,您知道任务实际上已经完成,因为如果不完成,您就不会到达执行中的那一行。因此,不需要手动检查任务的
    IsCompleted
    属性。

    您可以像这样重写代码:

    try
    {
        await ExcecuteMacroCode(_macroModeToUse, _macroCode, _site, _project);
        this.Close();
    }
    catch (Exception ex)
    {
        Helpers.DebugLogging($"[{DateTime.Now}]-[{ex}]");
    }
    
    您应该查看更多说明和示例,例如:

    public async Task<int> GetUrlContentLengthAsync()
    {
        var client = new HttpClient();
    
        Task<string> getStringTask =
            client.GetStringAsync("https://docs.microsoft.com/dotnet");
    
        DoIndependentWork();
    
        string contents = await getStringTask;
    
        return contents.Length;
    }
    
    void DoIndependentWork()
    {
        Console.WriteLine("Working...");
    }
    
    公共异步任务GetUrlContentLengthAsync() { var client=新的HttpClient(); 任务getStringTask= client.GetStringAsync(“https://docs.microsoft.com/dotnet"); 做独立的工作(); 字符串内容=等待getStringTask; 返回内容。长度; } void DoIndependentWork()