Tag: asynchronous

异步等待保持事件发生

我在C#.NET应用程序中有关于async \ await的问题。 我实际上是在基于Kinect的应用程序中尝试解决这个问题但是为了帮助我说明,我已经制作了这个类似的例子: 想象一下,我们有一个名为timer1的Timer,它设置了Timer1_Tick事件。 现在,我对该事件采取的唯一操作是使用当前日期时间更新UI。 private void Timer1_Tick(object sender, EventArgs e) { txtTimerValue.Text = DateTime.Now.ToString(“hh:mm:ss.FFF”, CultureInfo.InvariantCulture); } 这很简单,我的UI每隔几百分钟更新一次,我很高兴看到时间流逝。 现在想象一下,我也想用同样的方法计算前500个素数,如下: private void Timer1_Tick(object sender, EventArgs e) { txtTimerValue.Text = DateTime.Now.ToString(“hh:mm:ss.FFF”, CultureInfo.InvariantCulture); List primeNumbersList = WorkOutFirstNPrimeNumbers(500); PrintPrimeNumbersToScreen(primeNumbersList); } private List WorkOutFirstNPrimeNumbers(int n) { List primeNumbersList = new List(); txtPrimeAnswers.Clear(); int counter = 1; while (primeNumbersList.Count < […]

使用TaskCompletionSource作为WaitHandle替代品是否可以接受?

我的代码处理与远程主机的TCP连接,使用ConcurrentQueue存储传出消息。 它打算在单个线程中运行。 连接的生命周期包含在RunAsync而单独的对象包含连接的“公共状态”: class PublicState { internal readonly ConcurrentQueue OutgoingMessageQueue = new ConcurrentQueue(); internal TaskCompletionSource OutgoingMessageTcs = null; internal readonly TaskCompletionSource ConnectedTcs = new TaskCompletionSource(); public void EnqueueMessages(IEnumerable messages) { foreach( Message m in messages ) this.OutgoingMessageQueue.Enqueue( m); if( this.OutgoingMessageTcs == null ) this.OutgoingMessageTcs = new TaskCompletionSource(); this.OutgoingMessageTcs.SetResult( null ); } } static async Task […]

使用async await仍会冻结GUI

我想在单独的线程中处理长时间运行的操作,并使用async / await模式将控制返回到GUI线程,如下所示: private async void Button_Click(object sender, RoutedEventArgs e) { await Test(); txtResult.Text = “Done!”; } private Task Test() { Thread.Sleep(3000); return Task.FromResult(0); } 问题是,它无论如何都会冻结GUI 3秒钟(在3秒后显示Done!之前它会变得无法响应)。 我究竟做错了什么? 编辑:我试图取代以下逻辑: private void Button_Click(object sender, RoutedEventArgs e) { var thread = new Thread(() => Test(Callback)); thread.Start(); } private void Callback() { Dispatcher.Invoke(() => txtResult.Text = “Done!”); } […]

以线程或任务方式启动异步方法

我是C#的新手, await/async ,目前正在玩一下。 在我的场景中,我有一个简单的客户端对象,它具有WebRequest属性。 客户端应该通过WebRequest的RequestStream定期发送alive-messages。 这是client-object的构造函数: public Client() { _webRequest = WebRequest.Create(“some url”); _webRequest.Method = “POST”; IsRunning = true; // –> how to start the ‘async’ method (see below) } 和async alive-sender方法 private async void SendAliveMessageAsync() { const string keepAliveMessage = “{\”message\”: {\”type\”: \”keepalive\”}}”; var seconds = 0; while (IsRunning) { if (seconds % 10 […]

在进行异步WCF调用时,首选哪种方式?

当异步调用WCF服务时,似乎有两种方法可以完成。 1。 WcfClient _client = new WcfClient(); public void One() { _client.BegindoSearch(“input”, ResultOne, null); } private void ResultOne(IAsyncResult ar) { string data = _client.EnddoSearch(ar); } 2。 public void Two() { WcfClient client = new WcfClient(); client.doSearchCompleted += TwoCompleted; client.doSearchAsync(“input”); } void TwoCompleted(object sender, doSearchCompletedEventArgs e) { string data = e.Result; } 使用新的Task类,我们可以通过在同步中包装同步操作来轻松实现第三种方法。 3。 public void […]

使用async / await设置Thread.CurrentPrincipal

下面是我试图在异步方法中将Thread.CurrentPrincipal设置为自定义UserPrincipal对象的简化版本,但是自定义对象在离开await后会丢失,即使它仍然在新的threadID 10上。 有没有办法在await中更改Thread.CurrentPrincipal并在以后使用它而不传入或返回它? 或者这不安全,永远不应该是异步的? 我知道有线程更改,但认为async / await将为我处理同步。 [TestMethod] public async Task AsyncTest() { var principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = WindowsPrincipal // Thread.CurrentThread.ManagedThreadId = 11 await Task.Run(() => { // Tried putting await Task.Yield() here but didn’t help Thread.CurrentPrincipal = new UserPrincipal(Thread.CurrentPrincipal.Identity); principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = UserPrincipal // Thread.CurrentThread.ManagedThreadId = 10 }); principalType […]

C#UWP XAML-更新控件“同步”

在这个问题中,我已经包含了一些链接,这些链接表明我已经完成了一些寻找解决方案的工作。 我正在开发一个带触摸屏和GPIO的UWP应用程序。 UI具有停止按钮,重置按钮和文本块。 GPIO用于物理启动按钮,电机和2个限位开关。 电机可以旋转,直到它进入限位开关。 用于控制硬件的代码(例如,Motor.Forward())已经编写和测试,但为了简洁起见,将其排除在此问题之外。 出于同样的原因,排除了停止按钮的代码。 如果这些方法中的步骤将同步执行…可能会通过以下代码描述所需的行为: //Event handler for when physical start button is pushed private async void StartButtonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args) { Start(); } private void Start() { //Update UI stopButton.IsEnabled = true; resetButton.IsEnabled = false; textBlock.Text = “Motor turning”; Motor.Forward(); while(Motor.HasNotHitEndLimit()) Motor.Off(); //Update UI stopButton.IsEnabled = false; resetButton.IsEnabled = true; textBlock.Text […]

等待成千上万的任务

我有一个应用程序,通常有1.000 – 30.000文件转换一些数据。 我需要做3个步骤: 复制文件(替换那里的一些文字) 使用WebClient创建Webrequest以下载文件(我将复制的文件发送到WebServer,将文件转换为另一种格式) 获取下载的文件并更改部分内容 所以这三个步骤包括一些I / O,我使用了async / await方法: var tasks = files.Select(async (file) => { Item item = await createtempFile(file).ConfigureAwait(false); await convert(item).ConfigureAwait(false); await clean(item).ConfigureAwait(false); }).ToList(); await Task.WhenAll(tasks).ConfigureAwait(false); 我不知道这是否是最好的做法,因为我创造了超过一千个任务。 我想过将这三个步骤拆分为: List items = new List(); var tasks = files.Select(async (file) => { Item item = await createtempFile(file, ext).ConfigureAwait(false); lock(items) items.Add(item); }).ToList(); await […]

C#股票代码的异步任务

我一直在努力学习有关异步任务和线程的更多信息,但却没有取得很大进展。 我正在尝试加载一个“引擎”类型的线程,该线程将在启动时在后台运行,并且能够访问UI线程以更新变量,而无需挂起UI线程。 在下面的代码中,调用Engine,并创建一个Ticker对象,它保存名为Last的(Litecoin / USD)的当前值,还包含其他几个有用的值。 此代码成功将当前值分配给label1.text。 我不一定需要代码,但我会采用什么方法在后台每秒创建一个ticker对象,并使用每个新的Ticker对象值更新UI线程。 这对背景工作者来说是个好例子吗? private void Form1_Load(object sender, EventArgs e) { Engine(); } private void Engine() { Ticker ltcusd = BtceApi.GetTicker(BtcePair.LtcUsd); label1.Text = “LTC/USD:” + ltcusd.Last; } 编辑:如果我执行以下操作,由于跨线程操作尝试(UI线程中的label1),label1抛出InvalidOperationException。 private void Form1_Load(object sender, EventArgs e) { var t = Task.Factory.StartNew(() => Engine()); t.Start(); } private void Engine() { while (true) { Thread.Sleep(1000); […]

在异步读取期间TcpClient断开连接

我有一些关于完成tcp连接的问题。 在使用listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null);接受客户端后,客户端使用Tcp连接到我的服务器.BeginAcceptTcpClient listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null); ,我开始用networkStream.BeginRead(….)阅读。 当我等待消息时客户端断开连接会发生什么? (例如,它失去了电力,互联网等) 我怎么知道它什么时候发生? 如果成功读取后,我会做一些事情,然后调用networkStream.Close(); client.Close(); networkStream.Close(); client.Close(); 客户会看到什么? 如何“优雅地”终止连接? 如果我正在等待读取(使用BeginRead),然后(在不同的线程上)关闭相同的流会发生什么? 编辑添加:我确实在客户端和服务器之间发生了乒乓消息。 够了吗? 如果我没有收到ping,请终止我的NetworkStream? 肯定有一些更好的东西。