任务什么时候开始?
public void DoSomething() {
Task myTask = DoSomethingAsync();
Task.WaitAll(new[] { myTask }, 2000);
}
public async Task DoSomethingAsync() {
await SomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
它是在初始化时立即Task myTask = DoSomethingAsync();启动还是在您说等待时启动Task.WaitAll(new[] { myTask }, 2000);?
我正在尝试使用Windows附带的WinUsb.sys驱动程序(包括Raspberry Pi 2的Windows 10 IoT).使用devcon.exe我可以看到我正在尝试使用的USB连接(它被命名USB\VID_1234&PID_ABCD\5&3753427A&0&4),但我不知道如何强制它使用WinUsb.sys驱动程序.
我在microsoft.com上找到了一些说明,但这似乎是一个标准的Windows安装,你可以使用设备管理器(我没有IoT).此页面上的INF文件示例也引用了一个CAT文件,我认为这是某种驱动程序签名,我不知道如何生成它(或者我甚至需要).还有一个对Windows NT(Signature = "$Windows NT$")的引用,我不知道是否需要为IoT更改(或者是否需要为IoT更改其他任何内容).
因此,使用devcon.exe和某种INF文件,如何让Windows IoT使用WinUsb.sys作为我附加的USB设备的驱动程序?
EF Core 2.1+ 支持值转换。您可以使用内置函数EnumToStringConverter<>自动将枚举转换为字符串,反之亦然。
我正在连接到现有数据库,并希望将其中一列转换为枚举,所以EnumToStringConverter<>似乎正合我意。但是,数据库也不在我的控制范围内(我只有读取访问权限),因此如果有人在表中插入一行字符串值与我的任何枚举定义都不匹配,会发生什么情况?
我最好希望将任何未知值映射到枚举值,但除了手动创建自己的对象(在其中实现我自己的手动解析所有字符串值并映射它们)Unknown之外,我找不到任何有关如何执行此操作的文档ValueConverter到适当的枚举值。这看起来有点麻烦并且增加了额外的维护,所以我非常希望在这里进行一些自动化...这意味着如果在数据库中找到未知的字符串值,EFCore 会自动将其映射到我的自定义Unknown枚举值。
这可能吗?
在 .Net Core 中,您可以使用 .Net Core 自托管 Web 服务器WebHost。有一种方法称为CreateDefaultBuilder(),Microsoft 文档对此进行了说明:
CreateDefaultBuilder执行以下任务:
- 从以下位置加载应用程序配置:
- appsettings.json。
但是,似乎没有关于您可以放入哪些参数appsettings.json以WebHost自动获取默认值以外的配置值的任何文档。
例如,我尝试将以下内容添加到我的appsettings.json,但服务器启动时http://localhost:5000不管:
{
"Kestrel" : {
"urls" : "http://*:8080"
},
"server" : {
"urls" : "http://*:8080"
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以appsettings.json使用阅读自己ConfigurationBuilder,但这违背了文档的目的
那么,我需要在我的appsettings.json文件中放入什么才能CreateDefaultBuilder()不使用默认值?appsettings.json也欢迎列出所有可能的值。
当您从 Visual Studio (2017) 启动 ASP.NET Core 项目时,它假定工作目录是源代码所在的位置,而不是实际放置构建文件的位置。
这意味着当我运行我的项目时,它从 读取配置文件C:\Path\To\My\Project\appsettings.json,而不是从C:\Path\To\My\Project\bin\Debug\appsettings.json.
当我调试这段代码时,我可以看到情况是这样的:
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((context, config) => {
config.SetBasePath(context.HostingEnvironment.ContentRootPath);
config.AddJsonFile("appsettings.json", true, false);
});
Run Code Online (Sandbox Code Playgroud)
其中ContentRootPath指向项目文件夹,而不是放置构建文件的位置。
我可能可以通过设置Working Directoryin来解决这个问题Project Properties > Debug,但是由于我们还使用配置转换(SlowCheetah),每个开发人员都将拥有自己的调试输出构建配置(bin\Debug[CustomConfiguration]),并且.csproj对一个开发人员进行更改会破坏所有其他开发人员的配置。
有没有什么方法可以让 ASP.NET Core 从构建文件所在的位置而不是项目文件夹中读取配置文件,而无需更改Working Directory,但仍然适用于多个“构建配置”?
我知道之前已经问过这个问题的一个变体但是我的案例中没有一个答案可行(我不确定其他用户是否可以实际编译)
我创建了一个全新的WPF UserControl文件.Visual Studio现在显示围绕<Grid></Grid>此错误的蓝线:
"UserControl"类型不支持直接内容
我的项目已经引用了System.Xaml和UIAutomationProvider其他WPF程序集PresentationCore,PresentationFramework以及WindowsBase.
如果我构建解决方案,则错误消失.如果我然后对XAML文件进行一次更改(比如在某处添加空格),则会返回错误.
这非常烦人,因为我的整个XAML文件最终被Visual Studio强调为有错误并且难以阅读内容,而实际上它实际上并没有任何错误.
可以采取哪些措施来解决这种情况?
Azure Functions中的每个方法都可以Microsoft.Extensions.Logging.ILogger注入其中以进行日志记录。WebJobsStartup与启动类一起使用,您可以使用以下语法将日志记录更改为使用Serilog:
[assembly: WebJobsStartup(typeof(Startup))]
namespace MyFuncApp {
public class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddLogging(
lb => lb.ClearProviders()
.AddSerilog(
new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(@"C:\Temp\MyFuncApp.log")
.CreateLogger(),
true));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还可以将其他对象添加到DI中,然后使用ie将其注入到方法或包含该方法的类的构造函数中 builder.Services.AddSingleton<IMyInterface, MyImplementation>();
但是,我非常希望能够以Microsoft.Extensions.Logging.ILogger相同的方式注入,但是如果尝试ILogger在构造函数中使用,则在方法调用期间会收到以下错误(因为这是创建类时的错误):
Microsoft.Extensions.DependencyInjection.Abstractions:尝试激活“ MyFuncApp.MyFunctions”时,无法解析类型为“ Microsoft.Extensions.Logging.ILogger”的服务。
那么,有没有办法ILogger像这样将注入到类构造函数中?
public class MyFunctions
{
private IMyInterface _myImpl;
private ILogger _log;
public MyFunctions(
IMyInterface myImplememtation, // This works
ILogger log) // This does not
{
_myImpl = myImplementation;
_log = …Run Code Online (Sandbox Code Playgroud) 我发现在WPF窗口上使用WindowChrome可以使我在窗口中的任何位置放置内容,这是一个很好的想法。现在,我终于可以使标题栏具有与应用程序其余部分相同的颜色。
但是,我仍然喜欢出现在非样式窗口上的默认的最小化/最大化/关闭按钮。
有什么方法可以使用WindowChrome设置窗口样式,但仍保留默认按钮?
<Style x:Key="MainWindow" TargetType="{x:Type Window}">
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CaptionHeight="30" ResizeBorderThickness="5" />
</Setter.Value>
</Setter>
</Style>
<Window Style="{StaticResource MainWindow}">
<Grid Background="Black">
<MyContent />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
这将形成一个大的黑色窗口(很棒!),但是没有任何最小/最大/关闭按钮,因为它们隐藏在的后面Grid(不太好)。但是,这些按钮仍然可以单击,因此很明显它们在那里。
在 C#.NET Core 中,您可以使用以下代码创建通用主机:
IHostBuilder builder = new HostBuilder()
.ConfigureServices((context, collection) => {
collection.AddSingleton<IMyClass, MyClass>();
collection.AddHostedService<MyService>();
});
await builder.RunConsoleAsync();
Run Code Online (Sandbox Code Playgroud)
MyService这将使用默认 DI 容器创建一个新实例。
现在,假设我想在 内部创建一个新主机MyService。这很简单(在本例中是网络主机):
IWebHost webHost = WebHost.CreateDefaultBuilder()
.UseStartup<MyStartup>()
.Build();
.RunAsync();
Run Code Online (Sandbox Code Playgroud)
该 Web 主机将拥有自己的依赖项注入容器,因此它将无法访问我已添加到通用主机容器中的所有依赖项:即,它将无法注入IMyClass到MyStartup.
我还尝试IServiceProviderFactory<>使用以下代码添加自定义(基于.UseDefaultServiceProvider()它们用作IServiceCollection构建器类型的代码):
public class CustomServiceProviderFactory : IServiceProviderFactory<IServiceCollection>
{
private readonly IServiceProvider _provider;
public CustomServiceProviderFactory(IServiceProvider provider)
{
_provider = provider;
}
public IServiceCollection CreateBuilder(IServiceCollection services)
{
return services;
}
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder) …Run Code Online (Sandbox Code Playgroud) 我有一个WebApi返回一个简单的对象,但当我强制它返回XML(Accept: application/xml)时,它忽略了[XmlAttribute]我在对象上设置的属性.
这是我的目标:
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在代码中将其返回:
[RoutePrefix("api/mytest")]
public class MyTestController : System.Web.Http.ApiController
{
[HttpGet]
[Route("gettest")]
public Foo GetTest()
{
return new Foo() { Bar = "foobar" };
}
}
Run Code Online (Sandbox Code Playgroud)
生成的XML是:
<Foo>
<Bar>foobar</Bar>
</Foo>
Run Code Online (Sandbox Code Playgroud)
而我希望它会像这样返回:
<Foo Bar="foobar">
</Foo>
Run Code Online (Sandbox Code Playgroud)
为什么WebApi使用的XmlSerializer会忽略该[XmlAttribute]属性,如何让它像我想的那样工作?
c# ×6
.net-core ×2
asp.net-core ×2
wpf ×2
xaml ×2
.net ×1
appsettings ×1
async-await ×1
asynchronous ×1
enums ×1
self-hosting ×1
serilog ×1
slowcheetah ×1
task ×1
winusb ×1