WPF 執行含有有while的方法
點擊確定,把textbox的值賦給全域變數
點擊開始,執行Click方法


uj5u.com熱心網友回復:
遇到的問題是:一運行就卡死uj5u.com熱心網友回復:
查了些資料,異步,多執行緒這樣試了一下,還是卡死
uj5u.com熱心網友回復:
https://blog.csdn.net/desperaso/article/details/105728403
private void Modify_Sector()
{
while (true)
{
this.Dispatcher.InvokeAsync(() =>
{
。。。。。。。。。。。。
});
Thread.Sleep(1); // 必須要有,否則卡死
}
}
uj5u.com熱心網友回復:
你的邏輯有些問題吧,而且用async語法會簡單好看一些,我試了不卡
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
Class1.Num1 = int.Parse(textbox1.Text);
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
richtextbox1.AppendText("start");
await Task.Run(new Action(
() =>
{
while (true)
{
if (Class1.Num1 == 1) {
break;
}
System.Threading.Thread.Sleep(100);
}
}
));
richtextbox1.AppendText(Class1.Num1.ToString());
richtextbox1.AppendText("end");
Class1.Num1 = 0;
}
}
public class Class1
{
public static int Num1 { get; set; }
}
uj5u.com熱心網友回復:
Action應該不用顯式創建
private async void Button2_Click(object sender, RoutedEventArgs e)
{
richtextbox1.AppendText("start");
await Task.Run(() =>{
while (true){
if (Class1.Num1 == 1) {
break;
}
System.Threading.Thread.Sleep(100);
}
});
richtextbox1.AppendText(Class1.Num1.ToString());
richtextbox1.AppendText("end");
Class1.Num1 = 0;
}
uj5u.com熱心網友回復:
寫一個 Console 例子:using System;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
test1();
Console.WriteLine("..................按任意鍵結束");
Console.ReadKey();
}
static async void test1()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString());
await Task.Delay(5000);
}
}
}
}
uj5u.com熱心網友回復:
異步的程序中,不要使用阻塞陳述句,包括 Thread.Sleep 這類應該用異步的 Task.Delay 來實作。我們為了演示一個耗時的計算程序才會用這個陳述句,真正的業務邏輯處理中用阻塞是很過時的。uj5u.com熱心網友回復:
control.Dispatcher.Invoke(() => { control.Visibility = visibility; });任何執行緒中如果想執行UI操作,那么其執行緒單元必須設定為STA。
一個執行緒如果創建了UI物件,那么這個UI物件就只能被這個執行緒管理。
任何執行緒如果需要訪問其他的執行緒創建的UI物件,只能通過其他執行緒的Dispatcher進行訪問
一個執行緒如果沒有執行任何UI操作,那么其關聯的Dispatcher為null
以上文字內容選自https://www.cnblogs.com/DoNetCoder/p/4369903.html
uj5u.com熱心網友回復:
在你的代碼中,你使用一個子執行緒去運行一個 while 回圈代碼,但是你在子執行緒其中使用 Dispatcher.Invoke 去阻塞執行這個死回圈代碼,這叫什么呢?這就是自己阻塞。uj5u.com熱心網友回復:
是哦,直接delay就好了
using System.Threading.Tasks;
using System.Windows;
namespace WpfApp1 {
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e) {
Class1.Num1 = int.Parse(textbox1.Text);
}
private async void button2_Click(object sender, RoutedEventArgs e) {
richtextbox1.AppendText("start");
while (true) {
if (Class1.Num1 == 1) {
break;
}
await Task.Delay(1000);
}
richtextbox1.AppendText(Class1.Num1.ToString());
richtextbox1.AppendText("end");
Class1.Num1 = 0;
}
}
public class Class1 {
public static int Num1 { get; set; }
}
}
uj5u.com熱心網友回復:
多謝各位老哥,已經解決了 ,我再試試Delayuj5u.com熱心網友回復:
多謝分享,我要學習!uj5u.com熱心網友回復:
方法看起來不錯,但對電腦小白有點麻煩轉載請註明出處,本文鏈接:https://www.uj5u.com/net/46370.html
標籤:C#
