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. mysql性能优化学习笔记

    mysql性能优化 硬件对数据库的影响 CPU资源和可用内存大小 服务器硬件对mysql性能的影响 我们的应用是CPU密集型? 我们的应用的并发量如何? 数量比频率更好 64位使用32位的服务器版本 ...

  2. Linux下cp -rf总是提示覆盖的解决办法

    通常情况下使用cp -rf进行文件或者文件夹的管理时一般就不再提醒是否覆盖.然而在内网的一台机器上使用cp -rf却提示是否覆盖.难道和常用的命令不同? [root@xxxx test]# cp -r ...

  3. (转)关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系

    转自http://www.cnblogs.com/cywin888/p/3263027.html 刚接触iOS开发的人难免会对苹果的各种证书.配置文件等不甚了解,可能你按照网上的教程一步一步的成功申请 ...

  4. 没有body怎么添加onload事件

    <script type="text/javascript"> window.onload = function () { setup(); } </script ...

  5. Django~automated tests

    def xx(): 冒号下一行要缩进 ATD http://blog.csdn.net/doupei2006/article/details/7657547 http://www.jb51.net/a ...

  6. HTTP协议与HTML表单(再谈GET与POST的区别)

    HTTP的GET/POST方式有何区别?这是一个老生常谈的问题,但老生常谈的问题往往有一些让人误解的结论.本文将带您浅尝HTTP协议,在了 解HTTP协议的同时将会展示许多被人们忽视的内容.在掌握了H ...

  7. 【leetcode】Text Justification(hard) ☆

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  8. 【python】解压文件

    参考:http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法: https://docs.python.org/2/library/tarfile.h ...

  9. Hibernate 所有缓存机制详解

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

  10. log4j介绍以及使用教程

    一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接 口服务 器.NT的事件记录器.UNIX Syslog ...