//因在项目的窗体文本框中要显示COM组件回调函数所传回来的值,
//谁知测试时竟然显示
//""System.InvalidOperationException: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。"
//或者干脆罢工,一个也不给你显示出来.让我大为恼火,毕竟"魔高一尺,道高一丈".于是对此做了些分析与测试.
//终于顺利解决.
//究其原因为: 在Windows From里面,需要在线程里面访问界面元素,需要使用BeginInvoke来完成.
//本示例通过调用cAdd类中的 GetAddResult() 方法,通过事件(AddComplete)实时触发传送计算结果 ,
//在窗体的richTextBox中显示出来.
//因在项目的窗体文本框中要显示COM组件回调函数所传回来的值,
//谁知测试时竟然显示
//""System.InvalidOperationException: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。"
//或者干脆罢工,一个也不给你显示出来.让我大为恼火,毕竟"魔高一尺,道高一丈".于是对此做了些分析与测试.
//终于顺利解决.
//究其原因为: 在Windows From里面,需要在线程里面访问界面元素,需要使用BeginInvoke来完成.
//本示例通过调用cAdd类中的 GetAddResult() 方法,通过事件(AddComplete)实时触发传送计算结果 ,
//在窗体的richTextBox中显示出来.
![](/Images/OutliningIndicators/None.gif)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
![](/Images/OutliningIndicators/None.gif)
namespace TestInteractiveThread
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
public delegate void AddHandler(int iResult);
public partial class Form1 : Form
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
private cAdd ca;
public Form1()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
InitializeComponent();
ca = new cAdd();
ca.AddComplete += new AddHandler(ca_AddComplete);
}
![](/Images/OutliningIndicators/InBlock.gif)
public delegate void InvokeInitDelegate(); //不带参数的委托
public delegate void MyInitDelegate(RichTextBox myRtb, string strTemp); //带参数的异步委托
![](/Images/OutliningIndicators/InBlock.gif)
void ca_AddComplete(int iResult)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
// this.richTextBox1.AppendText(Environment.NewLine + iResult.ToString());
//采用上面的方法将产生下面的错误.
//"System.InvalidOperationException: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。"
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//在Windows From里面,需要在线程里面访问界面元素,需要使用BeginInvoke来完成.
//将上面的代码屏蔽掉,采用
//在创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托。
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) this.richTextBox1.BeginInvoke(new MyInitDelegate(DelegateInitMethod), new object[] { this.richTextBox1, iResult.ToString() });
}
catch (System.Exception err)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
strErr = err.ToString();
//在创建控件的基础句柄所在线程上异步执行委托。在创建控件的基础句柄所在线程上异步执行指定委托。
//由 .NET Compact Framework 支持。
this.BeginInvoke(new InvokeInitDelegate(InvokeInitMethod));
![](/Images/OutliningIndicators/InBlock.gif)
MessageBox.Show(err.ToString());
//throw new Exception("The method or operation is not implemented.");
}
}
![](/Images/OutliningIndicators/InBlock.gif)
private static string strErr = "";
private void InvokeInitMethod()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
this.richTextBox1.AppendText(strErr);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void DelegateInitMethod(RichTextBox myRtb, string strTemp)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
myRtb.AppendText(System.Environment.NewLine + strTemp);
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button_Test_Click(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//ca.GetAddResult();
//为了说明此问题我们采用下面的线程方法来调用.此时系统将弹出
//"System.InvalidOperationException: 线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它。"
System.Threading.Thread myThread = new System.Threading.Thread(
new System.Threading.ThreadStart(ca.GetAddResult));
myThread.Start();
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button1_Click(object sender, EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
this.richTextBox1.AppendText ( ca.AddInterlink(10).ToString() );
}
![](/Images/OutliningIndicators/InBlock.gif)
}
public class cAdd
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
public event AddHandler AddComplete;
public void GetAddResult()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int iResult=AddInterlink2(11);
AddComplete(iResult);
}
//1+1+2+3+5+8+13+21 ..+n
private static int AddInterlink2(int i)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int[] x = new int[i+1];
x[0] = 1;
x[1] = 1;
for (int j = 2; j <= i; j++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
x[j] = x[j - 1] + x[j - 2];
}
return x[i];
}
![](/Images/OutliningIndicators/InBlock.gif)
//也可采用下面的方法
![](/Images/OutliningIndicators/InBlock.gif)
private int x1=1,x2 = 1;
//1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + ![](/Images/dot.gif) + n
//x1,x2, x1, x2, x1, x2, x1, x2,![](/Images/dot.gif) ![](/Images/dot.gif) ![](/Images/dot.gif) .
//x1,x2, x3, x1, x2, x3, ![](/Images/dot.gif) ![](/Images/dot.gif) ![](/Images/dot.gif) ![](/Images/dot.gif) ![](/Images/dot.gif) .
public StringBuilder AddInterlink(int i)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
StringBuilder s1 = new StringBuilder();
s1.Append(x1.ToString() +","+ x2.ToString()+","); ;
int j=2;
while (j < i)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
x1 += x2;
x2 += x1;
s1.Append(x1.ToString() +","+ x2.ToString()+",");
j+=2;
}
return s1;
}
}
}
|