add more multithreading samples
This commit is contained in:
Родитель
8e9fa96cc0
Коммит
4aa0bcf92c
|
@ -24,6 +24,7 @@
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
using System;
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Xwt;
|
using Xwt;
|
||||||
|
@ -32,8 +33,9 @@ namespace Samples
|
||||||
{
|
{
|
||||||
public class MultithreadingSample: VBox
|
public class MultithreadingSample: VBox
|
||||||
{
|
{
|
||||||
Label l1, l2;
|
SampleBGWorker worker4, worker5, worker6;
|
||||||
ToggleButton btn1, btn2;
|
Label l1, l2, l3, l4, l5, l6;
|
||||||
|
ToggleButton btn1, btn2, btn3, btn4, btn5, btn6;
|
||||||
|
|
||||||
public MultithreadingSample ()
|
public MultithreadingSample ()
|
||||||
{
|
{
|
||||||
|
@ -93,6 +95,166 @@ namespace Samples
|
||||||
else
|
else
|
||||||
worker2cancel.Cancel();
|
worker2cancel.Cancel();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
tbl.Add (new Label("BackgroundWorker:\n(XwtSynchronizationContext.Post)"), 0, r);
|
||||||
|
tbl.Add (l3 = new Label ("0"), 1, r);
|
||||||
|
tbl.Add (btn3 = new ToggleButton("Run"), 2, r++);
|
||||||
|
|
||||||
|
var worker3 = new BackgroundWorker ();
|
||||||
|
worker3.WorkerReportsProgress = true;
|
||||||
|
worker3.WorkerSupportsCancellation = true;
|
||||||
|
worker3.DoWork += BackgroundWorkerDoWork;
|
||||||
|
worker3.ProgressChanged += (sender, e) => l3.Text = e.ProgressPercentage.ToString ();
|
||||||
|
|
||||||
|
btn3.Toggled += delegate {
|
||||||
|
if (btn3.Active)
|
||||||
|
worker3.RunWorkerAsync ();
|
||||||
|
else
|
||||||
|
worker3.CancelAsync ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
tbl.Add (new Label("XwtSynchronizationContext.Send:"), 0, r);
|
||||||
|
tbl.Add (l4 = new Label ("0"), 1, r);
|
||||||
|
tbl.Add (btn4 = new ToggleButton("Run"), 2, r++);
|
||||||
|
|
||||||
|
worker4 = new SampleBGWorker ();
|
||||||
|
worker4.SynchronizationContext = SynchronizationContext.Current;
|
||||||
|
worker4.InvokeSynchronized = true;
|
||||||
|
worker4.Count += HandleCount4;
|
||||||
|
|
||||||
|
btn4.Toggled += delegate {
|
||||||
|
if (btn4.Active)
|
||||||
|
worker4.Start ();
|
||||||
|
else
|
||||||
|
worker4.Stop ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
tbl.Add (new Label("ISynchronizeInvoke.BeginInvoke:"), 0, r);
|
||||||
|
tbl.Add (l5 = new Label ("0"), 1, r);
|
||||||
|
tbl.Add (btn5 = new ToggleButton("Run"), 2, r++);
|
||||||
|
|
||||||
|
worker5 = new SampleBGWorker ();
|
||||||
|
worker5.InvokeSynchronized = false;
|
||||||
|
worker5.Count += HandleCount5;
|
||||||
|
|
||||||
|
btn5.Toggled += delegate {
|
||||||
|
if (btn5.Active)
|
||||||
|
worker5.Start ();
|
||||||
|
else
|
||||||
|
worker5.Stop ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
tbl.Add (new Label("ISynchronizeInvoke.Invoke:"), 0, r);
|
||||||
|
tbl.Add (l6 = new Label ("0"), 1, r);
|
||||||
|
tbl.Add (btn6 = new ToggleButton("Run"), 2, r++);
|
||||||
|
|
||||||
|
worker6 = new SampleBGWorker ();
|
||||||
|
worker6.InvokeSynchronized = true;
|
||||||
|
worker6.Count += HandleCount6;
|
||||||
|
|
||||||
|
btn6.Toggled += delegate {
|
||||||
|
if (btn6.Active)
|
||||||
|
worker6.Start ();
|
||||||
|
else
|
||||||
|
worker6.Stop ();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackgroundWorkerDoWork (object sender, DoWorkEventArgs e)
|
||||||
|
{
|
||||||
|
BackgroundWorker worker = (BackgroundWorker)sender;
|
||||||
|
|
||||||
|
int cnt2 = 0;
|
||||||
|
while (!worker.CancellationPending) {
|
||||||
|
Thread.Sleep (50);
|
||||||
|
worker.ReportProgress(cnt2++);
|
||||||
|
}
|
||||||
|
e.Cancel = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleCount4 (object sender, CounterEventArgs e)
|
||||||
|
{
|
||||||
|
l4.Text = e.Cnt.ToString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleCount5 (object sender, CounterEventArgs e)
|
||||||
|
{
|
||||||
|
l5.Text = e.Cnt.ToString ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleCount6 (object sender, CounterEventArgs e)
|
||||||
|
{
|
||||||
|
l6.Text = e.Cnt.ToString ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SampleBGWorker
|
||||||
|
{
|
||||||
|
CancellationTokenSource stopReq;
|
||||||
|
Task task;
|
||||||
|
|
||||||
|
public event EventHandler<CounterEventArgs> Count;
|
||||||
|
|
||||||
|
public SynchronizationContext SynchronizationContext { get; set; }
|
||||||
|
|
||||||
|
public bool InvokeSynchronized { get; set; }
|
||||||
|
|
||||||
|
public void Start ()
|
||||||
|
{
|
||||||
|
stopReq = new CancellationTokenSource ();
|
||||||
|
task = Task.Factory.StartNew (CounterThread, stopReq.Token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop ()
|
||||||
|
{
|
||||||
|
stopReq.Cancel ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CounterThread ()
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
while (!stopReq.Token.IsCancellationRequested) {
|
||||||
|
Thread.Sleep (50);
|
||||||
|
cnt++;
|
||||||
|
if (Count != null) {
|
||||||
|
if (SynchronizationContext == null) {
|
||||||
|
foreach (var del in Count.GetInvocationList()) {
|
||||||
|
var target = del.Target as ISynchronizeInvoke;
|
||||||
|
if (target != null) {
|
||||||
|
if (InvokeSynchronized)
|
||||||
|
target.Invoke (del, new object[] { this, new CounterEventArgs (cnt) });
|
||||||
|
else
|
||||||
|
target.BeginInvoke (del, new object[] { this, new CounterEventArgs (cnt) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var args = new CounterEventArgs (cnt);
|
||||||
|
if (InvokeSynchronized) {
|
||||||
|
SynchronizationContext.Send (delegate {
|
||||||
|
Count (this, args);
|
||||||
|
}, null);
|
||||||
|
} else {
|
||||||
|
SynchronizationContext.Post (delegate {
|
||||||
|
Count (this, args);
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CounterEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public int Cnt { get; private set; }
|
||||||
|
|
||||||
|
public CounterEventArgs (int cnt)
|
||||||
|
{
|
||||||
|
Cnt = cnt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче