例如第1s輸出a,第2秒輸出b,第3秒輸出c
uj5u.com熱心網友回復:
[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);
}
uj5u.com熱心網友回復:
使用nuget引入rx.netuj5u.com熱心網友回復:
剛想說Rx發現已經被回答了
uj5u.com熱心網友回復:
這樣也行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}"));
uj5u.com熱心網友回復:
這樣還是可以 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}");
});
uj5u.com熱心網友回復:
是在winform里操作的,第一秒的時候顯示a,第二秒多顯示了一個b,輸出的是ab,第三秒多顯示c,輸出的是abc,直到最后字串全部顯示出來uj5u.com熱心網友回復:
是在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; });
uj5u.com熱心網友回復:
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);
}
}
}
uj5u.com熱心網友回復:
char c = 'a';
new Timer((x) =>
{
Console.WriteLine(c++);
}).Change(0, 1000);
uj5u.com熱心網友回復:
可以實作了,太感謝了
uj5u.com熱心網友回復:
cout<<
[a*2],Sleep(444)哦,原來是C#還以為是C++?
uj5u.com熱心網友回復:
不是應該用timer最簡單?uj5u.com熱心網友回復:
用定時器簡單些。。。
uj5u.com熱心網友回復:
就是逐字出現的動效嗎,做影片計時不用太準就延遲就行uj5u.com熱心網友回復:
每次輸出后,sleep(1000)就行了uj5u.com熱心網友回復:
畢竟 .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 委托來操作控制元件而已,其它異步編程邏輯是一樣的。
uj5u.com熱心網友回復:
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,編程很方便。
uj5u.com熱心網友回復:
哦,上述程式非常簡單,沒有什么耗時的計算,因此可以簡寫為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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/74868.html
標籤:C#
