我在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 …
有一个 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 …
我使用 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) 我有一个非常简单的日志实用程序,当前是同步的.它从UI(WPF)和线程池线程(Task.Run)调用,lock(_stream){_stream.WriteLine(message);}
用于线程安全.我想添加一个异步写入方法,但不知道如何使其线程安全.
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 ×2
async-await ×2
asynchronous ×2
c# ×2
asp.net ×1
blazor ×1
f# ×1
fable-f# ×1
relaycommand ×1
webforms ×1