Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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#_Printing_Task Parallel Library - Fatal编程技术网

C# 带任务打印

C# 带任务打印,c#,printing,task-parallel-library,C#,Printing,Task Parallel Library,我正在创建一个带有图形的标签,并使用PrintDocument打印它,之前我没有遇到任何问题,因为标签上的信息重复了多次,所以我只需设置副本,一切都会正常工作 但是现在每个标签都有不同的信息,所以它会冻结ui,因为我必须多次循环PrintDocument.Print(),而不是设置副本 我试过: Task t = new Task(() => { for (int i = 0; i < Cop

我正在创建一个带有图形的标签,并使用PrintDocument打印它,之前我没有遇到任何问题,因为标签上的信息重复了多次,所以我只需设置副本,一切都会正常工作

但是现在每个标签都有不同的信息,所以它会冻结ui,因为我必须多次循环PrintDocument.Print(),而不是设置副本

我试过:

 Task t = new Task(() =>
                    {

                        for (int i = 0; i < Copies; i++)
                        {
                            printDocument1.Print();                                
                            Label_Copies++;
                        }
                    });
 t.Start();
但它不起作用有办法解决吗

-信息来自用户界面
-500个标签
-在这些副本中,标签之间变化的唯一信息是

    if (Copias.Checked)
{
    e.Graphics.DrawString(Etiqueta_Copias.ToString(),
    new Font(font, 15, System.Drawing.FontStyle.Regular),
   Brushes.Black, new RectangleF(base_x + 140, base_y, 0, 0));
}
else
{
    e.Graphics.DrawString(Etiqueta_Copia.ToString(),
     new Font(font, 15, System.Drawing.FontStyle.Regular),
    Brushes.Black, new RectangleF(base_x + 140, base_y, 0, 0));
}

它基本上是一个标签号的计数器…

在我看来,如果我们忽略打印机的后台打印端,您的代码就是纯WinForms UI。 因为工作是成倍的,比如说100份,它变得太连续了

任务分配对你没有帮助,因为我认为打印端是“火与忘”,所以即使打印每个贴纸需要30秒,打印端也会立即返回,让UI在完成最后一个贴纸后立即开始下一个贴纸的繁重工作

假设用户界面每贴一张标签必须工作1秒,你看到的是100秒的用户界面阻塞。。。 我的建议是:


依靠后面的打印需要20秒这一事实:使用计时器而不是循环启动打印。将其设置为5、10或20秒(与打印机的速度相匹配)。每次你启动计时器时,它只会处理1张贴纸,然后安静地休息5、10或20秒…

我已经编辑了你的标题。请参见“”,其中的共识是“不,他们不应该”。
它不起作用。什么不起作用?没有指纹?是否引发异常?@LarsTech yes nothing Prints在没有任务的情况下调用此代码是否有效?如果是这样的话,我的猜测是绘制图形需要调用调度程序,而您的任务是在taskpool线程上执行的。@Chris是的,代码在没有任务的情况下工作,但ui冻结,这是我的问题/首先,我不认为这会有帮助,因为让ui冻结的是printDocument1.Print(),我打印每种类型的500个标签,打印机打印一个标签不到一秒钟,这里的问题是,只有一个信息不是来自用户界面的更改,所以我无法复制,我必须是页面或类似的循环,计时器不起作用,因为打印所有内容会花费太长时间,并且仍然会冻结ui。也许你可以试试这个。也许它允许您打印,而无需实际将位图绘制到表单中。不管怎样,定时器很容易尝试,虽然一些改进不是解决方案,但仍然是一种改进。。。
    if (Copias.Checked)
{
    e.Graphics.DrawString(Etiqueta_Copias.ToString(),
    new Font(font, 15, System.Drawing.FontStyle.Regular),
   Brushes.Black, new RectangleF(base_x + 140, base_y, 0, 0));
}
else
{
    e.Graphics.DrawString(Etiqueta_Copia.ToString(),
     new Font(font, 15, System.Drawing.FontStyle.Regular),
    Brushes.Black, new RectangleF(base_x + 140, base_y, 0, 0));
}