小编hej*_*oco的帖子

是正确运行异步方法所需的relaycommand的异步版本

我在viewmodel中定义了以下代码.我认为类型的SaveAsync Func<Task>正在转换为Action,因为RelayCommand采取的Action不是a,Func<Task>但我不清楚它的含义.

1)RelayCommand是否需要用异步版本(RelayCommandAsync)替换?2)当前代码在异步方面究竟做了什么?3)如果有什么可以/我应该改变以改善/纠正它怎么办?

private ICommand _saveCommand;
public ICommand SaveCommand
{
    get { return _saveCommand ?? (_saveCommand = new RelayCommand(async () => await SaveAsync(), CanSave)); }
}

public bool CanSave()
{
    return !IsBusy;
}

private async Task SaveAsync()
{
    IsBusy = true;

    try
    {
        await _service.SaveAsync(SomeProperty); 
    }
    catch ( ServiceException ex )
    {
        Message = "Oops. " + ex.ToString();
    }
    finally
    {
        IsBusy = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:经过一些实验后,似乎异步方法本身就能正常工作.是否包含在lambda中的async/await以及该方法是否定义为async Task或没有区别async void.

但是,无法正常工作的是canExecute …

.net c# asynchronous relaycommand async-await

14
推荐指数
2
解决办法
8712
查看次数

如何在 Web 表单中嵌入和使用 Blazor WebAssembly?

有一个 Web 表单应用程序,我希望通过将 Blazor 嵌入到 Web 表单页面中(就像使用 Angular 一样),逐页地将其逐渐移植到 Blazor WebAssembly。

将 Blazor 应用程序发布到 Web Forms 项目中名为“Blazor”的子目录下。如果我运行 Web 表单应用程序并点击 http://localhost:1234/Blazor,则 Blazor 应用程序运行良好(编辑 Blazor index.html => 后<base href="/Blazor/" />)。但是,当我尝试将 Blazor 嵌入 Web 表单页面时,它不起作用。Web 表单页面 asp:content 包含 Blazor index.html 页面包含的内容:

<%@ Page Title="EmbedTest" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="EmbedTest.aspx.cs" Inherits="WebFormBlazor.EmbedTest" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <app>Loading...</app>

    <div id="blazor-error-ui">
        An unhandled error has occurred.
        <a href="" class="reload">Reload</a>
        <a class="dismiss"></a> 
    </div>

    <script src="/Blazor/wwwroot/_framework/blazor.webassembly.js"></script>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

当我访问 http://localhost:1234/EmbedTest 时,页面显示:正在加载...发生了未处理的错误。重新加载

并在控制台中显示以下错误消息: Uncaught SyntaxError: Unexpected token '<' blazor.webassemble.js:1 …

asp.net webforms blazor blazor-webassembly

7
推荐指数
1
解决办法
4518
查看次数

使用新的 Fable.Browser.Dom 时,什么替换旧的 HTMLElement.style

我使用 fulma-demo 启动了一个项目,并尝试从另一个使用旧版本 Fable 和 Fulma 的示例项目中移植一些代码。它有以下行无法编译:

testWrapper.style.borderColor <- "#E95D0F"
Run Code Online (Sandbox Code Playgroud)

显然HTMLElement 上不再存在style属性。什么取代了它?

编辑:

open Fable.Core.JsInterop
open Browser
open Browser.Types
let testWrapper = document.querySelector(".test-wrapper")  :?> HTMLElement
Run Code Online (Sandbox Code Playgroud)

f# fable-f#

4
推荐指数
1
解决办法
686
查看次数

如何使用来自多个线程的async/await以线程安全的方式异步写入文件流

我有一个非常简单的日志实用程序,当前是同步的.它从UI(WPF)和线程池线程(Task.Run)调用,lock(_stream){_stream.WriteLine(message);}用于线程安全.我想添加一个异步写入方法,但不知道如何使其线程安全.

  1. 以下异步方法是否有效?
  2. 它会与现有的同步方法很好地结合使用吗?它们可以一起使用吗?
  3. 假设前一个问题已经解决,那么最终是否应该Debug.WriteLine进入try区块内部或者finally目前的位置之后 - 它是否会产生影响?
private static SemaphoreSlim _sync = new SemaphoreSlim(1);    

public static async Task WriteLineAsync(string message)
{
    if (_stream != null)
    {
        await _sync.WaitAsync();

        try
        {
            await _stream.WriteLineAsync(string.Format("{0} {1}", DateTime.Now.ToString("HH:mm:ss.fff") + message));
        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
        finally
        {
            _sync.Release();
        }

        Debug.WriteLine("{0} {1}", DateTime.Now.ToString("HH:mm:ss.fff"), message);
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading asynchronous async-await

2
推荐指数
1
解决办法
1777
查看次数