【问题标题】:The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering当前线程与 Dispatcher 没有关联。触发渲染时使用 InvokeAsync() 将执行切换到 Dispatcher
【发布时间】:2020-06-09 18:01:04
【问题描述】:

我正在使用 Dotnet Core Blazor 并在删除事件后使用 EventCallBack 绑定父网格时遇到错误。下面是使用子组件的代码

<tbody>
      @foreach (var employee in Employees)
       {
          <BlazorAppDemo.Pages.Controls.EmployeeList Employee="employee"
                                                           ShowFooter="ShowFooter"
                                                           OnEmployeeSelectionChange="onEmployeeSelectionChanged"
                                                           btnDeleteClick="OnEmployeeDeleted" >

            </BlazorAppDemo.Pages.Controls.EmployeeList>
        }
    </tbody> 

EmployeeList 子组件在下面

<tr>
@*<td>@Employee.EmployeeId</td>*@
<td><input type="checkbox" @onchange="CheckBoxChanged" /></td>
<td>@Employee.Department.DepartmentName</td>
<td>@Employee.FirstName</td>  
<td>@Employee.DateOfBirth.ToShortDateString()</td>
<td><img class="card-img-top img-thumb" style="width:50px;height:50px" src="@Employee.PhotoPath" /></td>
@if (ShowFooter)
{
    <AuthorizeView Roles="Admin" Policy="OldEmployeeBefore2020">
        <Authorized>
            <td>
                <a href="@($"employeedetails/{Employee.EmployeeId}")" class="btn btn-primary m-1">View</a>
                <a href="@($"employeeEdit/{Employee.EmployeeId}")" class="btn btn-primary m-1">Edit</a>
                @*<a href="#" class="btn btn-danger m-1">Delete</a>*@
                <button class="btn btn-danger m-1" @onclick="btnDelete_Click">
                </button>
            </td>
        </Authorized>
    </AuthorizeView> 
}

删除按钮事件:

 [Parameter]
    public EventCallback<int> btnDeleteClick { get; set; }

 protected async Task btnDelete_Click()
    {
        var response = await EmployeeService.Delete(Employee.EmployeeId).ConfigureAwait(false);

        if (string.IsNullOrEmpty(response.ErrorMessage))
        {               
            await btnDeleteClick.InvokeAsync(Employee.EmployeeId);               
            //NavigationManager.NavigateTo("employee");
        }
    }

父页面已订阅删除事件:

 protected async Task OnEmployeeDeleted(int id)
    {
        var response = await EmployeeService.GetEmployees().ConfigureAwait(false);
        if (response.Result != null)
        {  
            Employees = response.Result.Result; 
        }
        else
        {
            PageMessage = response.ErrorMessage;
        }
    }

【问题讨论】:

    标签: .net-core async-await blazor blazor-server-side configureawait


    【解决方案1】:

    您应该删除.ConfigureAwait(false)(据我所知是2x)。

    当您在 Blazor 中正确使用 async/await 时,您几乎不需要它。

    当您使用它时,您要求事件的其余部分在不同的线程上运行。大多数情况下是错误的线程。

    【讨论】:

    • 感谢您的回复。删除 .ConfigureAwait(false) 后,它现在开始工作。我进行了配置,因为我在异步调用中到处都收到警告“考虑在等待的任务上调用 ConfiguredAwait”。
    • 您可以发布该警告的文本​​或编号吗?因为那不应该发生。
    • 你能发布一个最小的 repo 来证明你的问题吗?我想试验一下,看看这是否是一个错误。
    • 等等,我正在尝试在 git 上上传我的仓库。完成后会通知您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多