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. jQuery之元素筛选

      1.eq()  筛选指定索引号的元素2.first() 筛选出第一个匹配的元素3.last() 筛选出最后一个匹配的元素4.hasClass() 检查匹配的元素是否含有指定的类5.filter() ...

  2. 【leetcode】Maximal Rectangle

    Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...

  3. java读取excel

    /* * this function will read from excel * and will return the items of excel */ public static String ...

  4. 【leetcode】Binary Tree Postorder Traversal (hard) ☆

    二叉树的后序遍历 用标记右子树vector的方法 vector<int> postorderTraversal(TreeNode *root) { vector<int> an ...

  5. POJ 2965 The Pilots Brothers' refrigerator

    题目链接 题意:一个冰箱上有4*4共16个开关,改变任意一个开关的状态(即开变成关,关变成开)时,此开关的同一行.同一列所有的开关都会自动改变状态.要想打开冰箱,要所有开关全部打开才行. 输入:一个4 ...

  6. [Android Pro] Android下toolbox简介

    toolbox是Android 自带的提供shell命令的软件.有点类似于busybox,但功能上好像弱很多.其源码可以从Android source code 中system/core/toolbo ...

  7. Xn数列(codevs 1281)

    题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...

  8. Jquery的普通事件和on的委托事件

    以click的事件为例: 普通的绑定事件:$('.btn').click(function(){})绑定 on绑定事件:$(documnet).on('click','btn2',function() ...

  9. SQL Server之存储过程基础知

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...

  10. Mysql事务隔离级别

    在说Isolation之前,需要谈谈关系型数据库的ACID特性. A(atomicity,原子性),指一个事务要么完全完成,要么全部回滚到起始状态,不存在中间状态. C(Consistency,一致性 ...