已知字符串"adcdefg" C#怎么用定时器每隔1s输出个字符?

jy773553 2020-01-16 05:19:19
例如第1s输出a,第2秒输出b,第3秒输出c
...全文
843 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哦,上述程序非常简单,没有什么耗时的计算,因此可以简写为
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

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

void button1_Click(object sender, EventArgs e)
{
Test();
}

async void Test()
{
this.label1.Text = string.Empty;
foreach (var c in "已知字符串\"adcdefg\" C#怎么用定时器每隔1s输出个字符?")
{
this.label1.Text += c;
await Task.Delay(500);
}
}
}
}

当有耗时的后台操作需要封装为Task中调用的“子Task”异步执行时,那么再要访问控件,就要注意使用 BeginInvoke。
  • 打赏
  • 举报
回复
winform中你可以写
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

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

void button1_Click(object sender, EventArgs e)
{
Test();
}

async void Test()
{
this.label1.Text = string.Empty;
foreach (var c in "已知字符串\"adcdefg\" C#怎么用定时器每隔1s输出个字符?")
{
this.BeginInvoke((Action)delegate
{
this.label1.Text += c;
});
await Task.Delay(500);
}
}
}
}



延时操作就是 await Task.Delay,编程很方便。
  • 打赏
  • 举报
回复
毕竟 .net 异步编程规范已经出来了许多年,许多编程语言都基本上统一。这类应该算是个常识来学习了。因此,大多数相关定时器、事件等等机制其实可以废弃
using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Test();
Console.WriteLine(".................按任意键结束");
Console.ReadKey();
}

private static async void Test()
{
foreach (var c in "已知字符串\"adcdefg\" C#怎么用定时器每隔1s输出个字符?")
{
Console.Write(c);
await Task.Delay(500);
}
}
}
}

对于winform,只不过是把输出字符那一行代码改为 control.BeginInvoke 委托来操作控件而已,其它异步编程逻辑是一样的。
xiaoxiangqing 2020-01-19
  • 打赏
  • 举报
回复
每次输出后,sleep(1000)就行了
jy773553 2020-01-17
  • 打赏
  • 举报
回复
可以实现了,太感谢了
Ruddens 2020-01-17
  • 打赏
  • 举报
回复
就是逐字出现的动效吗,做动画计时不用太准就延迟就行
正怒月神 2020-01-17
  • 打赏
  • 举报
回复
char c = 'a';
            new Timer((x) =>
            {
                Console.WriteLine(c++);
            }).Change(0, 1000);
ManBOyyy 2020-01-17
  • 打赏
  • 举报
回复
string aaa = "abcdfg";
int i = -1;
private void Form20_Load(object sender, EventArgs e)
{

}

private void timer1_Tick(object sender, EventArgs e)
{
i = i + 1;
if (i <= aaa.Length)
{
textBox1.Text = aaa.Substring(0, i);
}


}
}
wanghui0380 2020-01-17
  • 打赏
  • 举报
回复
引用 6 楼 weixin_40428416 的回复:
是在winform里操作的,第一秒的时候显示a,第二秒多显示了一个b,输出的是ab,第三秒多显示c,输出的是abc,直到最后字符串全部显示出来
Observable.Generate("abcdefghijk".GetEnumerator(),
                    events => events.MoveNext(),
                    events => events,
                    events => events.Current,
                    x => TimeSpan.FromSeconds(1))
                .ObserveOn(SynchronizationContext.Current)
                .Subscribe(p => { this.textBox1.Text += p; });
jy773553 2020-01-17
  • 打赏
  • 举报
回复
是在winform里操作的,第一秒的时候显示a,第二秒多显示了一个b,输出的是ab,第三秒多显示c,输出的是abc,直到最后字符串全部显示出来
wanghui0380 2020-01-17
  • 打赏
  • 举报
回复
这样还是可以
 Observable.Generate("abcdefghijk".GetEnumerator(),
                    events => events.MoveNext(), 
                    events => events,
                    events => events.Current, 
                    x => TimeSpan.FromSeconds(1))
                    .Timestamp()
                    .Subscribe(p =>
                    {
                        Console.WriteLine($"{p.Value},{p.Timestamp}");

                    });
wanghui0380 2020-01-17
  • 打赏
  • 举报
回复
这样也行
 string str = "abcdefghijk";
            var observable =
                Observable.Generate(0, x => x < str.Length, x => x + 1, x => x,
                    x => TimeSpan.FromSeconds(1)).Timestamp();

            observable.Subscribe(p => Console.WriteLine($"{str[p.Value]},{p.Timestamp}"));
qiangqiang2017 2020-01-17
  • 打赏
  • 举报
回复
用定时器简单些。。。
窝窝山大狗子 2020-01-17
  • 打赏
  • 举报
回复
不是应该用timer最简单?
  • 打赏
  • 举报
回复
cout<<[a*2],Sleep(444)哦,原来是C#还以为是C++?
threenewbee 2020-01-16
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
使用nuget引入rx.net

引用
Install-Package System.Reactive


引用
string x = "abcdefghijk";
var ob1 = x.ToObservable();
Observable.Interval(TimeSpan.FromSeconds(1))
.Zip(ob1, (a, b) => b)
.Subscribe(p => { Console.WriteLine(p); });


刚想说Rx发现已经被回答了
wanghui0380 2020-01-16
  • 打赏
  • 举报
回复
使用nuget引入rx.net
引用
Install-Package System.Reactive
引用
string x = "abcdefghijk"; var ob1 = x.ToObservable(); Observable.Interval(TimeSpan.FromSeconds(1)) .Zip(ob1, (a, b) => b) .Subscribe(p => { Console.WriteLine(p); });
qhwoaini 2020-01-16
  • 打赏
  • 举报
回复
[TestMethod]
        public void TimerTest()
        {
            string woutStr = "abcdefg";
            int index = 0;
            Timer timer = new Timer(new TimerCallback(obj =>
            {
                Debug.WriteLine(woutStr[index % woutStr.Length]);
                index++;
            }), null, 0, 1000);
            timer.Change(0, 1000);
            //等待输出
            Thread.Sleep(1000 * 10);
        }

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧