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. Arp攻击实战

    hyddd原创,转载请说明出处. 现在网上很多关于ARP攻击的文章,但多数是描述其原理,少数会以某个工具作为例子展开说明,但感觉说的还是不够详细,今天写个文章以实战介绍一个叫"WinArpA ...

  2. ubuntu下查找某个文件的路径

    参考:ubuntu下如何查找某个文件的路径      http://blog.csdn.net/lieyanhaipo/article/details/17055667 在Ubuntu有时候会遇到记得 ...

  3. TCP的几个状态

    转自: TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG)     http://www.cnblogs.com/lidabo/p/5713569.html

  4. DREAMWEAVER

    女孩儿!!!Coding之路,你没有什么不一样的!!!! 1024,程序员的节日,开会的时候,你对负责人说今天是我们的节日哎~~结果,得到的是负责人冷冰冰的眼神:“你还真把自己当程序员了!?” 一阵愣 ...

  5. 如何获得images.xcassets 中图片的路径?

    UIImage加载图片的方式以及Images.xcassets对于加载方法的影响 重点: Images.xcassets中的图片资源只能通过imageNamed:方法加载,通过NSBundle的pat ...

  6. Android Studio新建了一个项目提示Error:Unable to start the daemon process

    提示如下错误:

  7. yii验证码不使用model在控制器中进行验证

    控制器 public function actionCheckLogin(){ if(!$this->createAction('verify_code')->validate($_POS ...

  8. yii 多模板

    main.php: //替换所有模板 //加载文件名为first的模板 //       'theme'=>'theme1', 'components'=>array(           ...

  9. JqueryAjaxFormData文件异步上传

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  10. 利用 Rational ClearCase ClearMake 构建高性能的企业级构建环境

    转载地址:http://www.ibm.com/developerworks/cn/rational/r-cn-clearmakebuild/ 构建管理是 IBM® Rational® ClearCa ...