Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步用户界面更新_C#_Wpf_.net 4.5_Async Await - Fatal编程技术网

C# 异步用户界面更新

C# 异步用户界面更新,c#,wpf,.net-4.5,async-await,C#,Wpf,.net 4.5,Async Await,我几个月前才开始编程,所以我是一个纯粹的初学者 但我需要一个具有大量概率计算的数学应用程序和一个用于查看/交互的UI,所以我四处搜索,发现C#net是最好的方式。。。神奇的力量 如果我能做到这一点,将对我的进步有很大帮助: 带有文本框的Wpf窗口,在文本框中,每次计算完成时都会打印一个数字,但用户界面应该每次都响应 我尝试使用最新的NET4.5来实现这一点,因为应用程序需要速度快(所以使用最新的技术,而不是计时器或后台任务) 它可以工作,但是Ui被卡住了,无法移动(我想是因为我无法访问文本框)

我几个月前才开始编程,所以我是一个纯粹的初学者 但我需要一个具有大量概率计算的数学应用程序和一个用于查看/交互的UI,所以我四处搜索,发现C#net是最好的方式。。。神奇的力量

如果我能做到这一点,将对我的进步有很大帮助:

带有文本框的Wpf窗口,在文本框中,每次计算完成时都会打印一个数字,但用户界面应该每次都响应

我尝试使用最新的NET4.5来实现这一点,因为应用程序需要速度快(所以使用最新的技术,而不是计时器或后台任务)

它可以工作,但是Ui被卡住了,无法移动(我想是因为我无法访问文本框)

如果大家能帮助我,那将是非常棒的,我感谢大家,因为我从你们的帖子中学到了很多

这是我错误的新手代码

private Random rng;
public MainWindow()
{
    rng = new Random();
    InitializeComponent();
    Task.Run((Func<Task>) Calc);
}
private async Task Calc()
{
    while (true)
    {
        textBox1.Dispatcher.Invoke
             (DispatcherPriority.Normal
              , new Action(delegate() 
                 { 
                     textBox1.Text = rng.NextDouble().ToString(); 
                 }
                          )
              );
    }
}
私有随机rng;
公共主窗口()
{
rng=新随机数();
初始化组件();
任务运行((Func)计算);
}
专用异步任务计算()
{
while(true)
{
textBox1.Dispatcher.Invoke
(DispatcherPriority.Normal)
,新操作(委托()
{ 
textBox1.Text=rng.NextDouble().ToString();
}
)
);
}
}

你在走紧循环,当然是在非UI线程中,但是在UI线程中添加了大量要调用的委托。。。所以你的用户界面太忙了

目前,您的所有工作基本上都在UI线程中进行-您甚至没有在后台线程中计算
rng.NextDouble()

还要注意的是,您有一个
async
方法,没有
await
表达式,它应该触发编译器警告-您应该注意这一点

您说您不想使用“后台任务”,但这正是您通过调用
task.Run
所做的


现在我假设你的真实代码实际上不需要创建随机数。你真正的计算代码是什么样子的?它出现在哪个线程中?

你在紧循环,当然是在一个非UI线程中,但是在UI线程中添加了大量要调用的委托。。。所以你的用户界面太忙了

目前,您的所有工作基本上都在UI线程中进行-您甚至没有在后台线程中计算
rng.NextDouble()

还要注意的是,您有一个
async
方法,没有
await
表达式,它应该触发编译器警告-您应该注意这一点

您说您不想使用“后台任务”,但这正是您通过调用
task.Run
所做的


现在我假设你的真实代码实际上不需要创建随机数。你真正的计算代码是什么样子的,它发生在哪个线程?

也许我说错了我只是不想使用旧windows窗体中可用的旧后台任务和计时器来获得新4.5框架的所有功能计算代码应该在一个单独的线程中运行,而不是在Ui中运行,每次有新的数字可用时,将其发送到Ui,而Ui永远不会被卡住代码只是一个csv下载(一个线程)和calculation@analystLp:如果您已经在一个单独的线程中运行计算代码,那么我不确定async/await是否真的是您所需要的。只要您使用
Dispatcher.Invoke
,您应该已经很好了-如果您没有像您的示例那样重载UI线程。好的,那么我将继续学习如何创建一个真正的后台计算线程,该线程通过Dispatcher发送数字谢谢!好的,我想我已经能够用下面的代码以正确的方式完成它,因为start()方法工作,而RunSynchronously()不工作。。。太糟糕了,我现在还不能使用新的c#5.0 async and Wait关键字:p Task Task=new Task(new Action(Calc));task.Start();private void Calc(){rng=new Random();而(true){textBox1.Dispatcher.Invoke(DispatcherPriority.Normal,new Action(delegate(){textBox1.Text=rng.NextDouble().ToString();}));}@analystLp:这段代码仍然在循环。当您发送一个恒定的随机数流时,您希望UI做什么?听起来异步并不适合您在这里所做的工作,虽然你还没有对你正在做的事情做足够的解释,但我可能说错了。我只是不想使用旧windows窗体中可用的旧后台任务和计时器来获得新4.5框架的所有功能。计算代码应该在一个单独的线程中运行,而不是在Ui中运行,每次都有一个新的数字可用将其发送到Ui,该Ui永远不会被卡住。代码只是一个csv下载(一个线程)和calculation@analystLp:如果您已经在一个单独的线程中运行计算代码,那么我不确定async/await是否真的是您所需要的。只要您使用
Dispatcher.Invoke
,您应该已经很好了-如果您没有像您的示例那样重载UI线程。好的,那么我将继续学习如何创建一个真正的后台计算线程,该线程通过Dispatcher发送数字谢谢!好的,我想我已经能够用下面的代码以正确的方式完成它,因为start()方法工作,而RunSynchronously()不工作。。。太糟糕了,我现在还不能使用新的c#5.0 async and Wait关键字:p Task Task=new Task(new Action(Calc));task.Start();private void Calc(){rng=new Random();而(true){textBox1.Dispatcher.Invoke(DispatcherPriority.Normal,new Action(delegate(){textBox1.Text=rng.NextDouble().ToString();}));}@analystLp:这段代码仍然在循环。您希望UI做什么