在我的C#/ XAML metro应用程序中,有一个启动长时间运行过程的按钮.所以,按照建议,我使用async/await来确保UI线程不被阻止:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await GetResults();
}
private async Task GetResults()
{
// Do lot of complex stuff that takes a long time
// (e.g. contact some web services)
...
}
Run Code Online (Sandbox Code Playgroud)
偶尔,GetResults内发生的事情需要额外的用户输入才能继续.为简单起见,假设用户只需单击"继续"按钮即可.
我的问题是:如何以等待点击另一个按钮等事件的方式暂停GetResults的执行?
这是实现我正在寻找的东西的一种丑陋方式:"继续"按钮的事件处理程序设置了一个标志......
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
Run Code Online (Sandbox Code Playgroud)
...和GetResults定期轮询它:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)
民意调查显然非常糟糕(忙碌的等待/浪费周期),我正在寻找基于事件的东西.
有任何想法吗?
顺便说一下,在这个简化的例子中,一个解决方案当然是将GetResults()分成两部分,从开始按钮调用第一部分,从继续按钮调用第二部分.实际上,GetResults中发生的事情更复杂,并且在执行中的不同点可能需要不同类型的用户输入.因此,将逻辑分解为多种方法将是非常重要的.
.NET for Windows Store应用程序似乎不支持Thread.Sleep.
例如,这个
System.Threading.Thread.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)
将在针对任何.NET Framework(2.0,3.5,4.0,4.5)进行编译时进行编译,但在针对Windows应用商店应用程序(或者同时针对4.5和存储的可移植类库)中进行编译时不会编译.
System.Threading.Thread仍然存在,它只是没有Sleep方法.
我需要在我的应用程序中延迟几秒钟,是否有合适的替代品?
编辑为什么需要延迟:我的应用程序是一个游戏,延迟是让它看起来像计算机对手正在"思考"他的下一步行动.该方法已被异步调用(主线程未被阻止),我只想减慢响应时间.
谈到Dart中的JSON编码,根据Seth Ladd的说法,最终批准的官方方式是dart:convert+ JSON.Encode.
假设我们有一堆模型类(PODO),例如:
class Customer
{
int Id;
String Name;
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望能够对我的域对象进行JSON编码,如下所示:
var customer = new Customer()
..Id = 17
..Name = "John";
var json = JSON.encode(customer);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不会起作用......
Uncaught Error: Converting object to an encodable object failed.
Stack Trace:
#0 _JsonStringifier.stringifyValue (dart:convert/json.dart:416)
#1 _JsonStringifier.stringify (dart:convert/json.dart:336)
#2 JsonEncoder.convert (dart:convert/json.dart:177)
....
Run Code Online (Sandbox Code Playgroud)
...除非我们明确告诉dart:convert如何编码:
class Customer
{
int Id;
String Name;
Map toJson() {
Map map = new Map();
map["Id"] = Id;
map["Name"] = …Run Code Online (Sandbox Code Playgroud) 有没有办法为GitHub页面上托管的静态页面启用跨源资源共享(CORS)以允许Javascript中的跨源请求?
例如,我们可以以某种方式指示GH页面添加这些HTTP响应标头:
Access-Control-Allow-Origin:*
Access-Control-Allow-Methods:GET,POST
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers:*
Run Code Online (Sandbox Code Playgroud)
... GitHub Pages不支持客户服务器配置文件,如.htaccess或.conf ...
...听起来不是很有希望 - 或者有办法吗?
我在vNext中看到一个令人不安的趋势,需要一些启发,因为我没有看到我们被视为社区的大局.为什么vNext放弃了基本的OOP范式,比如接口代替我只能描述为"基于约定的编程"?
也许我只是运气不好,我开始的课程类型是一次性的独角兽,但在短短的三天里,我一直在使用vNext,我遇到了两个似乎放弃了基本编程结构的类让我神秘莫测.
第一个是中间件类.vNext中的中间件设计为在不实现任何接口的情况下工作,也不从任何公共基类继承,但通过Invoke方法在vNext管道中神奇地调用.我们什么时候决定接口合同毫无意义?这对我来说根本没有意义.如果有第三方打算调用我的中间件,那么应该有一份合同,声明我将实施XX.它表达意图并且还提供编译时检查.没有合同就没有什么能阻止所述第三方完全改变它所期望的方法的签名,并且只在运行时你知道出了什么问题.更不用说可怜的开发者,我和我的亲戚,盯着代码无法破译应该实施的内容和生命周期事件的顺序,这些事件让我从一个点A到另一个点B.
public class SampleMiddleware // complete lack of interface implementation or base class inheritance
{
private readonly RequestDelegate _next;
public SampleMiddleware(RequestDelegate next)
{
_next = next;
}
// yet a magical method that somehow gets invoked in a pipeline.. wth..
public async Task Invoke(HttpContext context)
{
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("SampleMidlleware fired!");
}
}
Run Code Online (Sandbox Code Playgroud)
第二个是在控制台应用程序中自托管的Web应用程序.当您尝试运行该命令以dnx . web仅在运行时启动自托管()时,您会收到错误,即您忘记了一个神奇的Startup类.再次,因为我缺乏术语,我只能将其描述为"基于约定的编程".在OWIN我们至少有OwinStartupAttribute可能在装配级应用.现在我们离开了,什么都没有.我的代码中没有任何内容表明我的意图是定义一个可以被第三方程序调用的启动类.
System.InvalidOperationException:在程序集"ConsoleApp1"中找不到名为"StartupDevelopment"或"Startup"的类型.
猜猜当你按照上面的例外中的"提示"时会发生什么?
System.InvalidOperationException:找不到"ConsoleApp1.Startup"类型中名为"ConfigureDevelopment"或"Configure"的方法.
失败的编程,是的宝贝!没问题,这只会使我估计需要多长时间才能运送这个应用程序.哦,你能猜出这个Startup …
假设我们在ElasticSearch索引中有一堆文档.每个文档在数组中都有多个位置,如下所示:
{
"name": "foobar",
"locations": [
{
"lat": 40.708519,
"lon": -74.003212
},
{
"lat": 39.752609,
"lon": -104.998100
},
{
"lat": 51.506321,
"lon": -0.127140
}
]
}
Run Code Online (Sandbox Code Playgroud)
该
geo_distance过滤器可以用每份文件的多个位置/点工作.一旦单个位置/点与过滤器匹配,文档将包含在过滤器中.
那么,是否可以创建一个地理距离过滤器来检查阵列中的所有位置?
不幸的是,这似乎不起作用:
{
"filter": {
"geo_distance": {
"distance": "100 km",
"locations": "40, -105"
}
}
}
Run Code Online (Sandbox Code Playgroud)
抛出" QueryParsingException[[myIndex] failed to find geo_point field [locations]"既然locations不是一个单一的,geo_point而是一个geo_points 的数组.
在 .NET CLI 中使用热重载时...
$ dotnet watch
watch : Hot reload enabled. For a list of supported edits, see https://aka.ms/dotnet/hot-reload. Press "Ctrl + R" to restart.
watch : Building...
...
watch : Started
Run Code Online (Sandbox Code Playgroud)
...任何粗鲁的编辑都会导致以下提示:
watch : Unable to apply hot reload because of a rude edit.
watch : Do you want to restart your app - Yes (y) / No (n) / Always (a) / Never (v)?
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 CLI 默认为“始终”?就像是dotnet watch --always-restart?
(询问是因为我想dotnet watch在容器中运行)
假设我们正在使用 GitHub Actions 来构建和发布我们应用程序的容器映像。我将在这里选择 ASP.NET Core 作为应用程序的技术堆栈,尽管这无关紧要。
我想讨论两种不同的方法:
1.“构建外部”:在 GitHub Actions runner 中构建/编译应用程序,将输出复制到容器镜像中
例如,我们的 GitHub 操作工作流文件可能如下所示...
name: build-outside
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
- name: .NET Publish
run: dotnet publish --configuration Release --nologo -p:CI=true -o $GITHUB_WORKSPACE/buildOutput src
- name: Build and push Docker image
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
repository: ${{ format('{0}/build-outside-test', secrets.DOCKERHUB_USERNAME) }}
tags: latest
Run Code Online (Sandbox Code Playgroud)
...有一个简单的 Dockerfile,如下所示:
FROM …Run Code Online (Sandbox Code Playgroud) 在Commodore 64 BASIC V2中,打印一个真正的布尔表达式输出-1:
READY.
A=(5=5)
READY.
PRINT A
-1
Run Code Online (Sandbox Code Playgroud)
为什么-1而不是1?

我们的产品有一个MSI安装程序(用WiX编写),基本上将一些文件复制到文件夹c:\ ourproduct中,并安装一个Windows服务"ourwindowsservice".
我们希望添加对该服务的多个实例的支持,并且应该可以彼此独立地安装/卸载它们.与SQL Server类似,每个实例都应该有一个名称,可以作为命令行参数传递给MSI.
示例:实例"A"=>将文件复制到"c:\ ourproductA",将服务安装为"ourwindowsserviceA"实例"B"=>将文件复制到"c:\ ourproductB",将服务安装为"ourwindowsserviceB"...
任何的想法?
实例转换似乎需要一组预定义和预先命名的实例.
谢谢
.net ×3
asp.net-core ×2
c# ×2
github ×2
.net-4.5 ×1
asp.net ×1
async-await ×1
basic ×1
c64 ×1
cors ×1
dart ×1
docker ×1
dotnet-cli ×1
github-pages ×1
hot-reload ×1
json ×1
msiexec ×1
wix ×1