namespace Test
{
using System;
using System.Windows.Forms;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
namespace Test
{
using System;
using System.Threading;
using System.Windows.Forms;
using Microshaoft;
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(119, 74);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(282, 253);
this.Controls.Add(this.button1);
this.Name = "MainForm";
this.Text = "MainForm";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button button1;
}
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var r = TaskProcesserHelper.ProcessWaitingShowDialog40
(
this
, new ProcessWaitingCancelableDialog()
, () =>
{
Thread.Sleep(5 * 1000);
//throw new Exception();
}
, () =>
{
Console.WriteLine("Finished");
}
, (x) =>
{
Console.WriteLine("Caught Exception: {0}", x);
}
);
Console.WriteLine(r);
}
}
}
namespace Microshaoft
{
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
public static class TaskProcesserHelper
{
public static int ProcessWaitingShowDialog
(
IWin32Window ownerWindow
, Func<Form> onWaitingDialogFactoryFunc
, Action onProcessAction = null
, Action onProcessedAction = null
, Action<Exception> onCaughtExceptionProcessAction = null
)
{
var dialogForm = onWaitingDialogFactoryFunc();
return
ProcessWaitingShowDialog
(
ownerWindow
, dialogForm
, onProcessAction = null
, onProcessedAction = null
, onCaughtExceptionProcessAction = null
);
}
public static int ProcessWaitingShowDialog40
(
IWin32Window ownerWindow
, Form dialogForm
, Action onProcessAction = null
, Action onProcessedAction = null
, Action<Exception> onCaughtExceptionProcessAction = null
)
{
var r = 1;
Task<DialogResult> task1 = Task.Factory.StartNew<DialogResult>
(
() =>
{
return dialogForm.ShowDialog();
}
);
Task task2 = Task.Factory.StartNew
(
() =>
{
try
{
//
onProcessAction();
r = 0;
}
catch (Exception e)
{
r = -1;
if (onCaughtExceptionProcessAction != null)
{
onCaughtExceptionProcessAction(e);
}
}
finally
{
TrySafeInvokeFormClose
(
dialogForm
, onCaughtExceptionProcessAction
);
}
try
{
onProcessedAction();
}
catch (Exception e)
{
//r = -1;
onCaughtExceptionProcessAction(e);
}
finally
{
TrySafeInvokeFormClose(dialogForm, onCaughtExceptionProcessAction);
}
}
);
Task.WaitAny(task1, task2);
//DialogResult dialogResult = await task;
return r;
}
public static int ProcessWaitingShowDialog
(
IWin32Window ownerWindow
, Form dialogForm
, Action onProcessAction = null
, Action onProcessedAction = null
, Action<Exception> onCaughtExceptionProcessAction = null
)
{
//var wait = new AutoResetEvent(false);
int r = 1;
if (onProcessAction != null)
{
new Thread
(
new ThreadStart
(
() =>
{
//wait.WaitOne();
Thread.Sleep(10);
try
{
//
onProcessAction();
r = 0;
}
catch (Exception e)
{
r = -1;
if (onCaughtExceptionProcessAction != null)
{
onCaughtExceptionProcessAction(e);
}
}
finally
{
TrySafeInvokeFormClose
(
dialogForm
, onCaughtExceptionProcessAction
);
}
try
{
onProcessedAction();
}
catch (Exception e)
{
//r = -1;
onCaughtExceptionProcessAction(e);
}
finally
{
TrySafeInvokeFormClose(dialogForm, onCaughtExceptionProcessAction);
}
}
)
).Start();
//wait.Set();
if (r != 0)
{
dialogForm.ShowDialog(ownerWindow);
}
}
return r;
}
private static bool TrySafeInvokeFormClose
(
Form dialogForm
, Action<Exception> onCaughtExceptionProcessAction
)
{
bool r = false;
try
{
if
(
dialogForm.IsHandleCreated
&& !dialogForm.IsDisposed
)
{
dialogForm.Invoke
(
new Action
(
() =>
{
//try
{
if
(
dialogForm.IsHandleCreated
&& !dialogForm.IsDisposed
)
{
dialogForm.Close();
}
//throw new Exception("理论上不应该被外侧 try catch 捕获?!?!?!?!?!");
}
/// catch (Exception e)
/// {
/// r = false;
/// if (onCaughtExceptionProcessAction != null)
/// {
/// onCaughtExceptionProcessAction(e);
/// }
/// }
}
)
);
Thread.Sleep(10);
}
r = true;
}
catch (Exception e)
{
r = false;
if (onCaughtExceptionProcessAction != null)
{
onCaughtExceptionProcessAction(e);
}
}
return r;
}
public static int ProcessWaitingCancelable
(
Func<AutoResetEvent> onWaitFactoryFunc
, Action onProcessAction
, Action onProcessedAction
, Action<Exception> onCaughtExceptionProcessAction
)
{
var wait = onWaitFactoryFunc();
return
ProcessWaitingCancelable
(
wait
, onProcessAction
, onProcessedAction
, onCaughtExceptionProcessAction
);
}
public static int ProcessWaitingCancelable
(
AutoResetEvent wait
, Action onProcessAction
, Action onProcessedAction
, Action<Exception> onCaughtExceptionProcessAction
)
{
int r = 1; //Cancel
new Thread
(
new ThreadStart
(
() =>
{
try
{
onProcessAction();
r = 0;
onProcessedAction();
}
catch (Exception e)
{
r = -1;
onCaughtExceptionProcessAction(e);
}
finally
{
wait.Set();
}
}
)
).Start();
wait.WaitOne();
return r;
}
}
}
namespace Microshaoft
{
using System;
using System.Drawing;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
public class ProcessWaitingCancelableDialog : Form
{
private IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
button1 = new Button();
SuspendLayout();
//
// button1
//
button1.DialogResult = DialogResult.Cancel;
button1.Location = new Point(98, 158);
button1.Name = "button1";
button1.Size = new Size(75, 23);
button1.TabIndex = 0;
button1.Text = "取消(&C)";
button1.UseVisualStyleBackColor = true;
//
// MainForm
//
AutoScaleDimensions = new SizeF(8F, 16F);
AutoScaleMode = AutoScaleMode.Font;
CancelButton = button1;
ClientSize = new Size(282, 253);
ControlBox = false;
Controls.Add(button1);
///Name = "MainForm";
///Text = "MainForm";
ResumeLayout(false);
}
private Button button1;
public Button CancelWaitButton
{
get
{
return button1;
}
}
public ProcessWaitingCancelableDialog()
{
InitializeComponent();
button1.Click += button1_Click;
}
void button1_Click(object sender, EventArgs e)
{
button1.Click -= button1_Click;
Close();
}
}
}

Waiting Processed Cancelable ShowDialog (Release 2)的更多相关文章

  1. Waiting Processed Cancelable ShowDialog

    namespace ConsoleApplication { using System; using System.Threading; using Microshaoft; /// <summ ...

  2. Git工作流指南:Gitflow工作流 Comparing Workflows

    Comparing Workflows The array of possible workflows can make it hard to know where to begin when imp ...

  3. git workflows

    https://www.atlassian.com/git/tutorials/comparing-workflows Comparing Workflows The array of possibl ...

  4. 优先队列运用 TOJ 4123 Job Scheduling

    链接:http://acm.tju.edu.cn/toj/showp4123.html 4123.   Job Scheduling Time Limit: 1.0 Seconds   Memory ...

  5. PatentTips - Fair scalable reader-writer mutual exclusion

    BACKGROUND The present invention relates generally to multithreaded programming and, more specifical ...

  6. flutter Waiting for another flutter command to release the startup lock…

    flutter安装完成后执行flutter doctor ,一直提示如下: Waiting for another flutter command to release the startup loc ...

  7. Flutter报错 Waiting for another flutter command to release the startup lock...

    Waiting for another flutter command to release the startup lock… 异常解决 平时我们在开发flutter过程中,在执行flutter p ...

  8. 解决flutter 运行时:Waiting for another flutter command to release the startup lock...

    执行 Flutter 包管理相关命令时有可能遇到 Waiting for another flutter command to release the startup lock... 这样的错误,可尝 ...

  9. Waiting for another flutter command to release the startup lock...

    2019独角兽企业重金招聘Python工程师标准>>> rm ./flutter/bin/cache/lockfile info from 转载于:https://my.oschin ...

随机推荐

  1. js 为label标签和div标签赋值

    <label id="ttile"></label> document.getElementById('ttile').innerText="&q ...

  2. C#读写SQL Server数据库图片

    效果图: 下载链接: http://download.csdn.net/detail/u010312811/9492402 1.创建一个Winform窗体,窗体分为“数据上传”和“数据读取”两部分: ...

  3. ACM/ICPC 之 DP-基因相似度(POJ1080-ZOJ1027)

    题意:两端基因片段,各有明确的碱基序列,现有一个碱基匹配的相似度数组,设计程序使得该相似度最大. //POJ1080-ZOJ1027 //题解:将s1碱基和s2碱基看做等长,添加一个碱基为'-',即每 ...

  4. Linux/Unix命令

    MAC 中自定义环境变量 打开:nano .bash_profile 查看:cat text 保存退出:Ctrl+C,Y #在.bash_profile 中添加tree alias tree=&quo ...

  5. centos6.5kvm虚拟化安装部署

    一.走进云计算 云计算:云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供, ...

  6. Apple Swift编程语言入门教程

    Apple Swift编程语言入门教程 作者: 日期: 布衣君子 2015.09.22 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 ...

  7. 25个增强iOS应用程序性能的提示和技巧(中级篇)(3)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(3) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  8. 解决spring+shiro cacheManager 登录报错

    一.项目启动,登录报错 org.springframework.beans.factory.BeanCreationException: Error creating bean with name ' ...

  9. Innodb之监控Buffer pool Load progress

    你可以使用PERFORMANCE SCHEMA中的相关信息监控BUFFER POOL状态加载进程. 1. 启用 stage/innodb/buffer pool load instrument: 2. ...

  10. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...