【发布时间】:2014-07-15 16:13:12
【问题描述】:
在 form1 我有这个公共方法:
public void CombindedStringFix()
{
BeginUpdate();
label3.Text = SaveOldHtml.HtmlLoadedFileNumber.ToString();
richTextBox1.Clear();
List<string> newText1 = new List<string>();
label1.Select();
scrollerList = new List<string>(Filters.newTextWithoutLinks);
scrollerText = string.Join(Environment.NewLine, scrollerList);
scroller1.TextToScroll = scrollerText;
combindedString = string.Join(Environment.NewLine, SaveOldHtml.newText);
richTextBox1.Text = combindedString;
string[] rlines = richTextBox1.Lines;
timer3.Start();
richTextBox1.SelectionStart = 0;
richTextBox1.SelectionLength = rlines[0].Length;
richTextBox1.SelectionColor = Color.Red;
richTextBox1.Select(rlines[0].Length, rlines[1].Length + 1);
richTextBox1.SelectionColor = Color.Green;
EndUpdate();
}
然后在新类中我调用这个方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Timers;
using System.Windows.Forms;
namespace ScrollLabelTest
{
class SaveOldHtml
{
private static Form1 frm1 = null;
private static int count;
private static System.Timers.Timer _timer = new System.Timers.Timer();
private static string page;
public static List<string> newText = new List<string>();
public static int HtmlLoadedFileNumber = 0;
public SaveOldHtml(string DirectoryToSave,int count, string contents)
{
System.IO.File.WriteAllText(DirectoryToSave + "Page" + count.ToString("D6")
+ ".html", contents);
}
public SaveOldHtml(string DirectoryToSave, List<string> newTextList, int count)
{
using (StreamWriter myStream = new StreamWriter(DirectoryToSave + "newTextList" + count.ToString("D6")
+ ".txt"))
{
for (int i = 0; i < newTextList.Count; i++)
{
myStream.WriteLine(newTextList[i]);
}
}
}
public static void Start(Form1 form)
{
frm1 = form;
_timer.Elapsed += _timer_Elapsed;
_timer.Interval = 10000;
count = 5;
LoadOldHtmlFiles();
frm1.CombindedStringFix();
_timer.Start();
}
static void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
_timer.Stop();
LoadOldHtmlFiles();
frm1.CombindedStringFix();
_timer.Start();
}
private static void LoadOldHtmlFiles()
{
page = File.ReadAllText(@"c:\temp\OldHtml\page" + count.ToString("D6") + ".html");
ListsExtractions.OffExtractions(@"c:\temp\OldHtml\page" + count.ToString("D6") + ".html", page, newText);
count ++;
HtmlLoadedFileNumber++;
}
}
}
一旦我在类的 Start 方法中调用 CombindedStringFix 方法,它就会工作并执行 CombindedStringFix 中的所有行。我使用了一个断点,它可以完成所有工作。
但是下次当它在新类中调用计时器滴答事件中的方法时,我使用了一个断点,并且一旦它执行第一行 BegingUpdate();它只是继续,永远不会在计时器滴答事件中再次停止,并且永远不会在 BeginUpdate() 之后继续;
即使我删除 BeginUpdate();所以它会做第一行然后继续它永远不会移动到下一行。
我现在看到我在计时器滴答事件中遇到异常:
跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问
System.InvalidOperationException was caught
HResult=-2146233079
Message=Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.Control.get_Handle()
at ScrollLabelTest.Form1.BeginUpdate() in e:\scrolllabel\ScrollLabel\ScrollLabel\Form1.cs:line 69
at ScrollLabelTest.Form1.CombindedStringFix() in e:\scrolllabel\ScrollLabel\ScrollLabel\Form1.cs:line 280
at ScrollLabelTest.SaveOldHtml._timer_Elapsed(Object sender, ElapsedEventArgs e) in e:\scrolllabel\ScrollLabel\ScrollLabel\SaveOldHtml.cs:line 64
InnerException:
我猜这与 frm1 变量有关。
【问题讨论】: