C#延迟执行 1.0版本

涉及的知识有泛型,委托,多线程

实现了延迟执行一个函数,可以指定延迟时间,延迟的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace WindowsFormsApplication1
{
    class DelayClass<T>
    {
      //  public Func<T> action;
       // public void DelayClass<T>(int i,Func<T> action){
       //     //setPara(i,action);

       //}

        private int time { get; set; }//延迟时间
        private T resualt { get;set;}//返回值

        private Func<T> func;//传入函数
        private T delay(int j,Func<T> action) {///实现函数的运行
            T s=default(T);
            if (action != null) {
               s= action();
            }
            return s;
        }
        private void delayme() {

            Thread delayThread = new Thread(new ThreadStart(delayDel));//新建一个线程来运行执行延迟时间
            delayThread.Start();

        }
        private void delayDel() { //延迟执行的作用
            int i=0;
            while (i < time) {
                i++;
                Thread.Sleep(1000);
            }
           resualt = delay(time, func);
           if (gs != null) {//委托传值,当线程延迟time时间后执行返回值,相当于一个事件
               gs(resualt);
           }
        }

        public void runthisFunc(int i,Func<T> action) {//设置该类的基本参数,传入时间和方法
            time = i;
          func = action;
        delayme();
        }
        public delegate void getresult(T result);//委托传值定义
        public getresult gs;

    }
}

基本的原理是利用泛型委托传入需要的参数,用一个新建线程延迟执行,执行完函数用委托做返回值

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DelayClass<string> dclass = new DelayClass<string>();         

            dclass.setPara(4,actionme);
            dclass.gs = gss;

        }
        public string actionme() {
            return "this has wait for 4 s";
        }
        private void gss(string ss) {//接受传回的值,并显示
            label1.Invoke(setlabedel, ss);//do something alse
        }
        private Action<string> setlabedel;//定义委托,线程不能访问UI
        private void setlable(string ss) {
            label1.Text=ss;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            setlabedel = setlable;
        }
    }
}

使用的时候实例化类,传入时间和方法。并实现该类的委托方法,即可调用该方法。

初步实现还需要很多更改,欢迎指正

时间: 2024-10-07 22:24:51

C#延迟执行 1.0版本的相关文章

HAProxy推2.0版本并全面支持现代架构

知名高效能开源负载平衡器HAProxy推出2.0版本,全面支持现代的架构,包括OSI第七层的重试机制.监控应用Prometheus的支持,使用者还能使用开源远程程序呼叫框架gRPC,也能以更多程序语言进行开发.HAProxy 2.0为一个长期支持版本.HAProxy 2.0是针对云端和容器环境设计的版本,针对原生云端应用程序的特性,服务会被不断地创建与终结,应用程序需要不停地执行部署以及更新配置,为了减少用户的工作,HAProxy 2.0提供了全新的Data Plane API,这是一个REST

iOS: 零误差或极小误差的定时执行或延迟执行?

问题如下: 节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密.对两者间隔要求不能超过0.02秒或更低. 目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去.请问有更好的方式来解决误差吗? var time = Date().timeIntervalSince1970 let dq = DispatchQueue(label: "queue", qos:

主流区块链技术特点及Fabric V0.6&V1.0版本特点

声明:文章内容来源于网络. 一.主流区块链技术特点 二.Hyperledger的fabric V0.6总体架构: 对应的0.6版本的运行时架构: 0.6版本的架构特点是: 结构简单: 应用-成员管理-Peer的三角形关系,主要业务功能全部集中于Peer节点:    架构问题:由于peer节点承担了太多的功能,所以带来扩展性.可维护性.安全性.业务隔离等方面的诸多问题,所以0.6版本在推出后,并没有大规模被行业使用,只是在一些零星的案例中进行业务验证: 三.Hyperledger的fabric V

延迟执行

// 延迟执行不要用sleep,坏处:卡住当前线程    [NSThread sleepForTimeInterval:(NSTimeInterval)]; // 一旦定制好延迟任务后,不会卡主当前线程[self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)#>]; //n秒后回到主线程执行block中的代码 dispatch_queue_t queue = dis

在 java 1.8.0 版本的环境下,进行 android apk 的签名操作

注:文章参考了 android 开发者社区的签名指引说明文章,但由于在国内 android 开发者社区已经无法正常访问,因此在这里做下记录. 地址:http://developer.android.com/tools/publishing/app-signing.html#considerations 在开发 android 应用程序的时候,到最后程序都需要进行签名后才可以发布,目前针对 android 应用开发的 ide 一般都会自带了签名的功能,例如 android studio.eclip

Mybatis分页插件2.0版本发布

项目地址:http://git.oschina.net/free/Mybatis_PageHelper 分页插件示例: http://blog.csdn.net/isea533/article/details/24700339 v2.0更新内容: 支持Mybatis缓存,count和分页同时支持(二者同步) 修改拦截器签名,拦截Executor,签名如下: @Intercepts(@Signature(type = Executor.class, method = "query", a

Hadoop2.6.0版本MapReudce示例之WordCount(二)

继<Hadoop2.6.0版本MapReudce示例之WordCount(一)>之后,我们继续看MapReduce的WordCount示例,看看如何监控作业运行或查看历史记录,以及作业运行时的文件目录及列表. 1.监控作业运行或查看历史记录 在WordCount的输出内容中,有这么一句:The url to track the job: http://server2:8088/proxy/application_1459913635503_0004/,这个是追踪作业运行的意思,登录后,可以查看

LINQ之路 6:延迟执行(Deferred Execution)

LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下面这个query: static void TestDeferredExecution() { var numbers = new List<int>(); numbers.Add(1); IEnumerable<int> query = numbers.Select(n =>

解决android3.0版本以上应用接收不到开机广播问题

现在是2014-07-16 下午15:27. 好久没写过东西,突然间灵感喷发想写点东西(其实是刚刚弄好了一个棘手的问题,自豪中..呵呵呵呵 我牛掰).废话不多说,进入正题. 不知道你们又没有碰到这问题,本身做的一个应用,能够监听开机广播的.但很奇怪,在android3.0以下的版本 你怎么跑都没问题.但是在android3.0以上的版本就恐怕情况不一样了.你会发现往往很多时候接收不到开机广播.这是为什么呢?嘿 不告诉你! 说笑的 其实这方面百度很多人给出为什么了.我在这就不多废话了,今天我们要说