我们的团队正在创建一个新的征聘工作流程系统来替换旧的。我已经负责迁移的老数据转换为新的架构。我已经决定要做到这一通过创建一个小Windows形式项目的架构是完全不同的和直接的TSQL脚本不是一个适当的解决办法。

主要的封类ImportController'做的工作宣布以下代表的事件:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

主要的窗口,开始一个静态的方法,在这类使用一个新的线:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

该ImportProgressEvent args携带串的信息,最大int值方面取得的进展酒吧和一个当前的进展int值。Windows形式subcribes的事件:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

和回应事件,以这种方式使用它自己的委托:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

最后进度条和列表框,是更新:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

事情是列表框似乎更新很快,但进展吧不动直到本批处理几乎是完整的???为什么?

有帮助吗?

解决方案 4

@约翰

谢谢你的链接。

@会

有没有从中获得threadpooling为我知道它会永远只能产生一个线程。使用一线纯粹是具有响应的用户界面,同时SQL服务器被捣与读和写。它肯定不是一个短暂的螺纹。

关于大锤子你是对的。但是,事实证明了我的问题之间的屏幕和主席之后。我似乎有一个不同寻常的批的数据,有许多许多许多外键的记录,比其它批次,只发生在得到选择在过程的早期阶段意义的currentProgress没有得到++'d的一个良好的10秒钟。

@所有

谢谢你的投入,这让我想到,我在寻找其他地方代码,导致我该时刻谦卑的我证明了又一次错误的通常是人:)

其他提示

也许你可以尝试BackgroundWorker组件.它使得穿容易。实例:

也许以外的范围,但是,有时有用的做 Application.DoEvents(); 使gui件作出反应的用户输入,例如按下取消按钮在状态吧对话。

你任何机会运行Windows Vista?我已经注意到了完全相同的事情中的一些工作相关的应用程序。不知何故,似乎有一个延迟时的进度条"动画".

你确定这UI线运行的自由在所有这一进程?即它不会阻止了在加入或某些其他等等吗?那是什么它看起来像我。

建议使用BackgroundWorker是一个很好-肯定优于试图大锤己的方式出的问题载的刷新/更新电话。

和BackgroundWorker将使用泳池,线,这是一个友好的方式来表现要比创建自己的短命线。

有没有从中获得threadpooling作 我知道它会永远只能产生一个 螺纹。使用一线纯粹是 有一个响应的用户界面,同时SQL 服务器被捣与读 写。它肯定不是一个短 命线。

好吧,我赞赏,并高兴你找到你的错误,但是你看BackgroundWorker?它几乎完全是你在做什么,但在一个标准化方式(即没有自己的代表),并不需要创建一个新的线两者均为(也许很小,但可能仍然有用)的优点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top