假设我有以下代码:public async void Run(){ TaskCompletionSource t = new TaskCompletionSource(); Prepare(t.Task); await Task.Delay(1000); t.SetResult(); Console.
假设我有这样的代码:
public async void Run()
{
TaskCompletionSource t = new TaskCompletionSource();
Prepare(t.Task);
await Task.Delay(1000);
t.SetResult();
Console.WriteLine("End");
}
public async void Prepare(Task task)
{
await Run(task, "A");
await Run(task, "B");
await Run(task, "C");
await Run(task, "D");
}
public async Task Run(Task requisite, string text)
{
await requisite;
Console.WriteLine(text);
}
时会发生什么 t.SetResult();
?这是多线程吗?控制台中项目的顺序有任何保证吗?如果我有一个 List<>
,并且该 Run
方法会改变它,我需要担心多线程吗?
我想使用 SDL2 创建 ASCII 艺术,但我不明白为什么我会得到这个结果:原始图像的程序输出](https://i.sstatic.net/1IUV743L.png)是](https://i.sstatic.net/ytrb2...
我想使用 SDL2 创建 ASCII 艺术,但我不明白为什么我会得到这个结果: 原始图像的 程序输出 https://i.sstatic.net/1IUV743L.png https://i.sstatic.net/1IUV743L.png ) ]( https://i.sstatic.net/ytrb2R0w.png ) 它是一个 bmp 文件。看起来图像被复制了,下面有一个巨大的空白。但是,我的代码似乎是正确的。
这是在控制台中绘制图像的代码
#define ASCII_WIDTH 130
#define ASCII_HEIGHT 100
int asciiArt(SDL_Surface* image)
{
if(image == NULL)
return 0;
SDL_Surface *imgResized = SDL_CreateRGBSurface(0, ASCII_WIDTH, ASCII_HEIGHT, 32, 0, 0, 0, 0);
if(imgResized == NULL)
return 0;
SDL_BlitScaled(image, NULL, imgResized, NULL);
char ascii[] = " `.-':_,^=;><+!rc*/z?sLTv)J7(|Fi{C}fI31tlu[neoZ5Yxjya]2ESwqkP6h9d4VpOGbUAKXHm8RD#$Bg0MNWQ%&@";
Uint32* pixel = NULL;
SDL_Color color;
Uint8 gray;
int pos;
SDL_LockSurface(imgResized);
for(int i = 0; i < imgResized->h; i++)
{
for(int j = 0; j < imgResized->w; j++)
{
pixel = (Uint32*)imgResized->pixels + i * imgResized->pitch + j * imgResized->format->BytesPerPixel;
SDL_GetRGB(*pixel, imgResized->format, &color.r, &color.g, &color.b);
gray = (color.r + color.g + color.b) / 3;
pos = gray * (strlen(ascii) - 1) / 255;
printf("%c", ascii[pos]);
}
printf("\n");
}
SDL_UnlockSurface(imgResized);
if(imgResized != NULL)
SDL_FreeSurface(imgResized);
return 1;
}
我很迷茫,不知道错误在哪里,也不知道从哪里开始查找。谢谢!