我可以编写一个长期运行的CLI应用程序并运行它,但我认为它不符合标准兼容的Linux守护程序的所有期望(响应SIGTERM,由System V init进程启动,忽略终端I/O信号等)
大多数生态系统都有一些最佳实践方法,例如,在python中,你可以使用https://pypi.python.org/pypi/python-daemon/
是否有一些关于如何使用.Net Core执行此操作的文档?
我正在尝试从单元测试中单独测试事件SmtpClient.SendCompleted的测试,并且我遇到了一个烦人的问题,测试在事件实际触发之前继续处理,终止应用程序而不实际进入事件.那么,想象下面的代码:
[TestClass]
public class emailTest
{
public bool sentEmail = false;
[TestMethod]
public void sendEmail()
{
SmtpClient smtp = new SmtpClient("smtpserver");
smtp.SendCompleted += delegate(Object sender, System.ComponentModel.AsyncCompletedEventArgs e) { sentEmail = true; };
MailMessage mm = new MailMessage("from@address.com", "to@address.com", "test subject", "test body");
smtp.SendAsync(mm, "test");
Assert.IsTrue(sentEmail);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我手动插入这样的延迟,则此测试失败...
[TestClass]
public class emailTest
{
public bool sentEmail = false;
[TestMethod]
public void sendEmail()
{
SmtpClient smtp = new SmtpClient("smtpserver");
smtp.SendCompleted += delegate(Object sender, System.ComponentModel.AsyncCompletedEventArgs e) { sentEmail = true; };
MailMessage …Run Code Online (Sandbox Code Playgroud) 我TaskCompletionSource在我的软件中使用将网络数据包分发到async/await方法。因此,在我的代码中,软件需要等待网络数据包从接收处理程序中解复用并移交给方法的多个点async Wait()。每秒可能有很多很多数据包,我正在决定是否要将数据包推送到TaskCompletionSource或将其放入Queue. 因此,只要没有,TaskCompletionSource我就会创建一个新的,这会导致一个新的Task对象。
根据这个问题Do I need to dispose of a Task? 根据此博客,不需要使用.NET 进行并行编程 。然而,我有时每秒实例化数千个。链接博客中的详细答案还说,可以在内部使用。现在我有一种强烈的感觉,我的情况就是确切的情况,我应该在.TaskDisposeTaskCompletionSourceTaskWaitHandleDisposeTaskCompletionSource
这就是我等待新数据包的方式。该方法将被调用await,也可以被大量并行调用:
public async Task<Packet> Wait()
{
Packet packet;
lock (sync)
if (packets.TryDequeue(out packet))
return packet;
else
waiter = new TaskCompletionSource<Packet>();
return await waiter.Task;
}
Run Code Online (Sandbox Code Playgroud)
我从网络处理程序推送数据包的方法如下所示:
public void Poke(Packet packet)
{
lock (sync)
if (waiter == null)
packets.Enqueue(packet);
else
waiter.SetResult(packet); …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
static void Main(string[] args)
{
moHost = new Host(
APIServerType.Simulator,
"T4Example",
"112A04B0-5AAF-42F4-994E-FA7CB959C60B",
"CTS",
"myUser",
"myPass"); //automated login
moHost = Host.Login(
APIServerType.Simulator,
"T4Example",
"112A04B0-5AAF-42F4-994E-FA7CB959C60B"); //manual login window
moAccounts = moHost.Accounts;
System.Console.WriteLine(moAccounts.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我知道第一次自动登录是发送的异步请求,我需要"等待".
登录成功将触发:
public event Host.LoginSuccessEventHandler LoginSuccess
Run Code Online (Sandbox Code Playgroud)
登录失败会触发:
public event Host.LoginFailureEventHandler LoginFailure
Run Code Online (Sandbox Code Playgroud)
通用通知将由以下方式触发:
public event Host.NotificationEventHandler Notification
Run Code Online (Sandbox Code Playgroud)
如何处理此问题并正确等待登录成功或失败?
第一次自动登录尝试没有显示我连接,而第二个手动登录窗口确实成功(因此我可以认为我的凭据很好,现在只是代码没有正确'等待').
我有一个屏幕,可以从远程服务器检索信息并将该信息显示给用户.我希望在显示屏幕时更新此信息(无需其他用户交互).
public partial class MyPage : ContentPage
{
protected override async void OnAppearing()
{
base.OnAppearing();
try
{
MyLabel.Text = (await GoGetTheData ()).Stuff;
}
catch (Exception e)
{
MyLabel.Text = "Narg";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以接受吗?我已经看到了关于"异步void"的邪恶的所有讨论,以及它应该如何仅在事件处理程序中使用,而且这不是一个事件处理程序.
在这种情况下,框架是否保证正常,因为我(1)在获得所有异步之前调用了base.OnAppearing(),并且(2)捕获了我的异常?
我是c#异步等待机制的新手.我已经检查过所有以前的async示例,等待但是它们都不像我的.我想做什么?我有一个foreach循环,我想在某个规则上停止它,做一些事情并通过点击按钮继续运行.这是一个简单的代码示例:
private void RunConvert() // START
{
foreach (PartSettings File in PartsFromXLS) // RUNING THE FOREACH LOOP ON A LIST
{
ProcessSinglePart(PathStep, PathMCX);
}
}
public static async void ProcessSinglePart(string PartPathToRead, string PartPathToSave)
{
// DO SOME STUFF BEFORE THE CHECK
if (PartLength < PartWidth) // SOME CHECK VALUES
{
await WhenClicked(); //HERE I WOULD LIKE TO WAIT FOR BUTTON CLICK
}
//DO SOME STUFF AFTER THE CHECK
}
private void GeometryOK_Click(object sender, EventArgs e)
{
// I WOULD LIKE …Run Code Online (Sandbox Code Playgroud) 我正在.NET Core中为旧的照明控制台开发接口,目前正在实现数据包。此接口/ API的基本思想如下:客户端在一个UDP端口上发送其数据包,并且控制台以错误代码响应。控制台通过另一个UDP端口发送其数据包。
因此,在设计API时,我只是使用了Action<ErrorCode>作为回调函数。但是,当一次处理多个数据包时,此方法不是很实用。
我的UdpClient收到数据包时引发一个事件,但控制台返回的错误代码不超过4字节。
所以我已经尝试过使用SemaphoreSlim。
我的想法是让发送方等到事件发生并释放信号量。问题基本上是,这是处理此问题的最快,最“干净”的方法:
// The Event-Callback:
private void Sender_Recieve(object sender, ErrorCode e)
{
lastError = e;
semaphore.Release();
}
// The SendPacket method:
public async Task<ErrorCode> SendPacketAsync(Packet packet)
{
// send packet
await semaphore.WaitAsync();
return lastError;
}
Run Code Online (Sandbox Code Playgroud)
那么,有什么方法可以更快/更好地做到这一点而又不会降低性能?
我想在 WPF 窗口中创建一个按钮,单击该按钮时,等待用户单击该窗口并获取单击的位置。一旦获取到位置,程序将继续执行下一行代码并显示点击的位置。
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="Pick Point & Display it!" HorizontalAlignment="Left" Margin="301,172,0,0" VerticalAlignment="Top" Width="168" Click="Button_Click" RenderTransformOrigin="1.479,2.177"/>
</Grid>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
var point = WaitTillUserClicks();
MessageBox.Show(point.ToString());
}
private Point WaitTillUserClicks()
{
// Prompt the user for a mouse click and do not proceed unless he has clicked at least once on the Window
}
Run Code Online (Sandbox Code Playgroud) c# ×6
asynchronous ×4
async-await ×3
.net ×2
asp.net-core ×2
events ×2
.net-core ×1
button ×1
daemon ×1
dispose ×1
foreach ×1
linux ×1
mouseevent ×1
task ×1
unit-testing ×1
wpf ×1
xamarin ×1