Кроме того, я использовал Jint для вызова JS Script, и два потока работают хорошо (потому что Jint не нужно вызывать в методе Control.BeginInvoke). < /P>
Все еще хочу знать: < /p>
Есть ли способ переключаться между этими двумя потоками? < /li>
< /ol>
Код: Выделить всё
public partial class Form1 : Form
{
private JSHelper _jsHelper1;
private JSHelper _jsHelper2;
private Thread _thread1;
private Thread _thread2;
public Form1()
{
InitializeComponent();
_jsHelper1 = new JSHelper(textBox1);
_jsHelper2 = new JSHelper(textBox2);
webBrowser1.Url = new Uri($"{Application.StartupPath}\\text.html");
webBrowser1.ObjectForScripting = _jsHelper1;
webBrowser2.Url = new Uri($"{Application.StartupPath}\\text.html");
webBrowser2.ObjectForScripting = _jsHelper2;
}
private void button1_Click(object sender, EventArgs e)
{
_thread1 = new Thread(() =>
{
BeginInvoke((EventHandler)delegate
{
webBrowser1.Document.InvokeScript("main");
});
});
_thread1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
_thread2 = new Thread(() =>
{
BeginInvoke((EventHandler)delegate
{
webBrowser2.Document.InvokeScript("main");
});
});
_thread2.Start();
}
}
< /code>
jshelper.cs
[System.Runtime.InteropServices.ComVisible(true)]
public class JSHelper
{
private TextBox _logTextBox;
public JSHelper(TextBox tb)
{
_logTextBox = tb;
}
public void println(string txt)
{
int begin = Environment.TickCount;
int leftTime;
do
{
//Some business logic here which needs timeout
Application.DoEvents(); //If remove this line, the UI will freeze.
leftTime = 1000 - CalcCurrentTickCount(begin);
} while (leftTime > 0);
_logTextBox.BeginInvoke(new Action(() =>
{
_logTextBox.AppendText($"\r\n{txt}");
}));
}
private int CalcCurrentTickCount(int dwBeginTickCount)
{
int dwTickCount = 0;
int dwEndTickCount = Environment.TickCount;
if (dwEndTickCount < dwBeginTickCount)
{
dwTickCount = (int)~0 - (dwBeginTickCount - dwEndTickCount);
}
else
{
dwTickCount = dwEndTickCount - dwBeginTickCount;
}
return dwTickCount;
}
}
< /code>
xtext.html
function main()
{
for (var i = 0; i < 10; i++)
{
window.external.println("Hello world!");
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... egininvoke