我用C++编写了一些后端代码,并用C#为它编写了一个前端.我想让它做的是在后台运行后端代码,这样我就可以做其他事情,比如更新进度条,但当我单击"开始"按钮时,程序会挂起,直到它运行完后端代码.

C#代码:

    [DllImport("backend.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int executeBackend();

    private async void startButton_Click(object sender, EventArgs e)
    {
        startButton.Enabled = false;
        await StartProgram();
    }

    private async Task StartProgram()
    {
        int status = 0;
        status = executeBackend(); //This is causing the UI to deadlock
        startButton.Enabled = true;
    }

Ackend.dll C++代码:

extern "C" {
    __declspec(dllexport) int executeBackend()
    {
        int statusCode = 0;
        //Do stuff in the background
        return statusCode;
    }
}

如果我注释掉运行ecuteBackend的调用并将其替换为await Task.Delay(5000);,则UI不会死锁.我该怎么解决这件事?

推荐答案

您可以将对executeBackend的呼叫包装在Task中,以防止用户界面锁定.

var status = await Task.Run(() => executeBacked());

我还认为你对async关键字的实际作用感到困惑.我认为对您来说,阅读一下Asynchronous Programming在DotNet中是如何工作的可能是谨慎的.

Csharp相关问答推荐

PredicateBuilder不是循环工作,而是手动工作

在命令行中使用时安装,但在单击时不会安装

向类注入一个工厂来创建一些资源是一个好的实践吗?

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

以自动方式注销Azure身份应用程序

编写DataAnnotations自定义验证器的多种方法

如何使用CsvReader获取给定列索引的列标题?

如何在C#中删除一个特殊字符,如"使用Regex"

try 还原包时出错:Dapper已经为System.Data.SQLClient定义了依赖项''''

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

我找不到ASP.NET Web应用程序(.NET框架).已 Select .NET框架项目和项模板以及此组件(&Q;)

为什么我的用户界面对象移动到略低于实际目标?

ASP.NET MVC数据批注验证组复选框

Linq SELECT的多条指令

在C#和HttpClient中使用REST API

测试单个对象是否与Func<;T,bool>;匹配

如何在C#Visual Studio IF语句中删除换行符