线程交互

十一路 2008-07-17 10:04:38
C# form 窗体

我使用了一个线程来执行上传, 我要把 上传的进度 显示在 form 窗体的label中

我直接在线程里面写 label.text = persent 赋值 报"线程间操作无效"

也用了事件 ,还是报错

这个应该怎么实现 谢谢
...全文
200 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
parfum 2008-07-18
  • 打赏
  • 举报
回复
用委托
lfzwenzhu 2008-07-18
  • 打赏
  • 举报
回复
标记一下
beijingbeerman 2008-07-18
  • 打赏
  • 举报
回复
在窗体中启动线程,然后在线程中操作窗体的控件这是不被允许的。
因为窗体控件在主线程中,子线程操作主线程是跨线程操作。解决方法是使用委托,委托回窗体线程操作控件。
歪歪 2008-07-17
  • 打赏
  • 举报
回复
才找到的代码,应该可以帮助楼主
歪歪 2008-07-17
  • 打赏
  • 举报
回复

using System;
using System.Threading;

namespace Cmpxx
{
public delegate void ExampleCallback(int lineCount);

public class ThreadArgState
{
private string boilerplate = "";
private int value = 0;

private event ExampleCallback callback = null;

public ThreadArgState(string text, int number,ExampleCallback callbackDelegate)
{
boilerplate = text;
value = number;
callback = callbackDelegate;
}

public void ThreadProc()
{
Console.WriteLine(boilerplate, value);
Thread.Sleep(5000);
if (callback != null)
{
//触发事件
callback(20);
}
}
}

public class Example
{
public static void SCMain()
{
//主函数执行
ThreadArgState tws = new ThreadArgState("This report displays the number {0}.", 422, new ExampleCallback(ResultCallback));

Thread t = new Thread(new ThreadStart(tws.ThreadProc));
t.Start();
Console.WriteLine("Main thread does some work, then waits.");
t.Join(); //等待线程处理完毕后才执行后面的程序,把他注释掉在看运行结果就明白了
Console.WriteLine("Independent task has completed; main thread ends.");
}

public static void ResultCallback(int lineCount)
{
Console.WriteLine("Independent task printed {0} lines.", lineCount);
}
}


}
家鸣 2008-07-17
  • 打赏
  • 举报
回复
这样的问题,应通过委托来做。线程中通过委托调用来更新UI。
frankworld 2008-07-17
  • 打赏
  • 举报
回复
楼上说的方法是正道
强烈不建议直接跨线程操作!
TeaBall 2008-07-17
  • 打赏
  • 举报
回复
backgroundworker有个好象叫ReportProgress的事件,可以给进度的改变通知给预订者。
atlasroben 2008-07-17
  • 打赏
  • 举报
回复
说错了哈,是公共变量,而且Control.CheckForIllegalCrossThreadCalls = false;在某些控件跨线程调用的时候会出错,所以你最好使用其他的更安全的方法,.net2.0有个东西叫backgroundwork,可以帮你实现简单的异步操作和消息传递
atlasroben 2008-07-17
  • 打赏
  • 举报
回复
线程间通信可以使用公共函数
也可以使用消息队列,事件
如果你是跨线程操作winform控件有个更简单的
Control.CheckForIllegalCrossThreadCalls = false;

110,927

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧