Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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
如何同时启动两个foreach循环c#wpf_C#_Wpf - Fatal编程技术网

如何同时启动两个foreach循环c#wpf

如何同时启动两个foreach循环c#wpf,c#,wpf,C#,Wpf,是否可以在两个标签中同时使用字符逐个显示字符串 两个不同的Dispatcher.BeginInvoke(新操作(()) 我有两个这样的foreach循环: string str1 = "NUMBER OF PASSED:" + "\t\t" + passed1.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed1.ToString(); foreach (var ch1 i

是否可以在两个标签中同时使用字符逐个显示字符串 两个不同的Dispatcher.BeginInvoke(新操作(())

我有两个这样的foreach循环:

        string str1 = "NUMBER OF PASSED:" + "\t\t" + passed1.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed1.ToString();

        foreach (var ch1 in str1)
        {
            var char_by_char1 = ch1;
            Dispatcher.BeginInvoke(new Action(() =>
            {                    
                first_result.Content += char_by_char1.ToString();
                System.Threading.Thread.Sleep(5);
            }), DispatcherPriority.Background);
        }


        string str2 = "NUMBER OF PASSED:" + "\t\t" + passed2.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed2.ToString();

        foreach (var ch2 in str2)
        {
            var char_by_char2 = ch2;
            Dispatcher.BeginInvoke(new Action(() =>
            {
                second_result.Content += char_by_char2.ToString();
                System.Threading.Thread.Sleep(5);
            }), DispatcherPriority.Background);
        }
var dispatcherObj = Dispatcher.CurrentDispatcher;

string str1 = "NUMBER OF PASSED:" + "\t\t" + passed1.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed1.ToString();

var tsk1 = Task.Factory.StartNew(()=>
{
    foreach (var ch1 in str1)
    {
        var char_by_char1 = ch1;
        dispatcherObj.Invoke(new Action(() =>
        {                    
            first_result.Content += char_by_char1.ToString();
            System.Threading.Thread.Sleep(5);
        }), DispatcherPriority.Background);
    }
});


string str2 = "NUMBER OF PASSED:" + "\t\t" + passed2.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed2.ToString();

var tsk2 = Task.Factory.StartNew(()=>
{
    foreach (var ch2 in str2)
    {
        var char_by_char2 = ch2;
        dispatcherObj.Invoke(new Action(() =>
        {
            second_result.Content += char_by_char2.ToString();
            System.Threading.Thread.Sleep(5);
        }), DispatcherPriority.Background);
    }
});

你不能用第三方物流来代替,比如:

        string str1 = "NUMBER OF PASSED:" + "\t\t" + passed1.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed1.ToString();

        foreach (var ch1 in str1)
        {
            var char_by_char1 = ch1;
            Dispatcher.BeginInvoke(new Action(() =>
            {                    
                first_result.Content += char_by_char1.ToString();
                System.Threading.Thread.Sleep(5);
            }), DispatcherPriority.Background);
        }


        string str2 = "NUMBER OF PASSED:" + "\t\t" + passed2.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed2.ToString();

        foreach (var ch2 in str2)
        {
            var char_by_char2 = ch2;
            Dispatcher.BeginInvoke(new Action(() =>
            {
                second_result.Content += char_by_char2.ToString();
                System.Threading.Thread.Sleep(5);
            }), DispatcherPriority.Background);
        }
var dispatcherObj = Dispatcher.CurrentDispatcher;

string str1 = "NUMBER OF PASSED:" + "\t\t" + passed1.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed1.ToString();

var tsk1 = Task.Factory.StartNew(()=>
{
    foreach (var ch1 in str1)
    {
        var char_by_char1 = ch1;
        dispatcherObj.Invoke(new Action(() =>
        {                    
            first_result.Content += char_by_char1.ToString();
            System.Threading.Thread.Sleep(5);
        }), DispatcherPriority.Background);
    }
});


string str2 = "NUMBER OF PASSED:" + "\t\t" + passed2.ToString() + Environment.NewLine + "NUMBER OF FAILED:" + "\t" + failed2.ToString();

var tsk2 = Task.Factory.StartNew(()=>
{
    foreach (var ch2 in str2)
    {
        var char_by_char2 = ch2;
        dispatcherObj.Invoke(new Action(() =>
        {
            second_result.Content += char_by_char2.ToString();
            System.Threading.Thread.Sleep(5);
        }), DispatcherPriority.Background);
    }
});
我正在任务/非UI线程上运行循环,并使用Dispatcher.Invoke发布UI更改。答案是肯定的

但不像你在那里做的那样

Dispatcher begininvoke将在UI线程上运行您的操作

这个线程是用来处理UI的所有事情,包括你可能不想打断的事情,比如显示你的新角色

作为经验法则

永远不要休眠UI线程,因为它会冻结UI

在本例中,“other”调用无法执行任何操作,因为您烧掉了试图在其上运行它的线程。启动的第一个调用是在一段时间内唯一可以执行任何操作的调用,在它完成之前,您将看不到结果

我建议您删除以下行:

  System.Threading.Thread.Sleep(5);
现在不会有延迟,但您的ui不会被冻结

使该操作异步

插入一行:

await Task.Delay(5);
睡觉的地方

你预计会耽搁多久

5是5毫秒

也许你想要500或5000

然后你释放了这个线程,你认为他们应该有机会表现得更像你期望的那样

根据您正试图执行的操作,您可能会更好地附加到操作列表中,每个操作都会更改一个字母


然后,您可以使用wait task.delay进行迭代以引入延迟。

您的意思还不完全清楚:该代码可以工作,但将在第一个结果中显示str1,然后在第二个结果中显示str2。您的意思是要交错它们(对于它们,您只需要一个循环,并且在每个循环中调用两次)?为什么你想一个角色一个角色地在事件循环中单独发帖?感谢的Prateek Shrivastava这正是我想要的:D