Я переставил коды:
using System;
namespace sodacrate
{
public class Sodacrate
{
private string[] flaskor = new string[24];
private int antal_flaskor = 0;
public int sum = 0;
public void Run()
{
Console.WriteLine("|*|Välkommen till läskbacken!|*|");
int temp = 0;
do
{
Console.WriteLine("|*|Välj ett alternativ|*|");
Console.WriteLine("/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/~*/");
Console.WriteLine("(1): Lägg till en läsk");
Console.WriteLine("(2): Skriv ut innehållet i läskbacken");
Console.WriteLine("(3): Beräkna totala värdet på läskbacken");
Console.WriteLine("(4): Avsluta programmet");
temp = int.Parse(Console.ReadLine());
switch (temp)
{
case 1:
add_soda();
break;
case 2:
print_crate();
break;
case 3:
calc_total();
break;
case 4:
Console.WriteLine("Programmet avslutas...");
break;
default:
Console.WriteLine("Ogiltig inmatning");
break;
}
} while (temp != 0);
}
public void add_soda()
{
if (antal_flaskor == 24)
{
Console.WriteLine("Läskbacken är full, du kan inte lägga till fler flaskor!");
return;
}
Console.WriteLine(" |*|*|~MENY~|*|*|");
Console.WriteLine(" Välj valfri läsk");
Console.WriteLine("/------------------/");
Console.WriteLine("(1): Coca-Cola 5kr");
Console.WriteLine("(2): Fanta 5kr");
Console.WriteLine("(3): Sprite 5kr");
Console.WriteLine("(4): Pepsi 5kr");
Console.WriteLine("(5): Trocadero 5kr");
Console.WriteLine("/------------------/");
int temp = int.Parse(Console.ReadLine());
bool meny = true;
do
{
switch (temp)
{
case 1:
Console.WriteLine("Coca-Cola");
meny = false;
break;
case 2:
Console.WriteLine("Fanta");
meny = false;
break;
case 3:
Console.WriteLine("Sprite");
meny = false;
break;
case 4:
Console.WriteLine("Pepsi");
meny = false;
break;
case 5:
Console.WriteLine("Trocadero");
meny = false;
break;
default:
Console.WriteLine("Ogiltig inmatning");
meny = false;
break;
}
} while (meny);
Console.WriteLine("Tryck för att återgå till menyn...");
}
public void print_crate()
{
foreach (var dryck in flaskor)
{
if (dryck != null)
Console.WriteLine(dryck);
else
Console.WriteLine("Ledig");
}
}
public int calc_total()
{
int total = 0;
foreach (var dryck in flaskor)
{
if (dryck != null)
total += 5;
}
return total;
}
}
}
class Program
{
public static void Main(string[] args)
{
var sodacrate = new sodacrate.Sodacrate();
sodacrate.Run();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
Нет, я не думаю, что существует. Подход потока пула является, вероятно, самым прагматичным. С другой стороны, я предполагаю, что Вы могли выпадающий к P/Invoke - но это будет намного большим количеством работы.
Я не нашел асинхронную версию GetFiles, однако если Вы смотрите на исходный код для других Асинхронных операций, они определяются следующим образом:
module FileExtensions =
let UnblockViaNewThread f =
async { //let ctxt = System.Threading.SynchronizationContext.Current
do! Async.SwitchToNewThread ()
let res = f()
do! Async.SwitchToThreadPool ()
//do! Async.SwitchTo ctxt
return res }
type System.IO.File with
static member AsyncOpenText(path) = UnblockViaNewThread (fun () -> System.IO.File.OpenText(path))
static member AsyncAppendText(path) = UnblockViaNewThread (fun () -> System.IO.File.AppendText(path))
static member AsyncOpenRead(path) = UnblockViaNewThread (fun () -> System.IO.File.OpenRead(path))
static member AsyncOpenWrite(path) = UnblockViaNewThread (fun () -> System.IO.File.OpenWrite(path))
static member AsyncOpen(path,mode,?access,?share) =
let access = match access with Some v -> v | None -> System.IO.FileAccess.ReadWrite
let share = match share with Some v -> v | None -> System.IO.FileShare.None
UnblockViaNewThread (fun () -> System.IO.File.Open(path,mode,access,share))
static member OpenTextAsync(path) = System.IO.File.AsyncOpenText(path)
static member AppendTextAsync(path) = System.IO.File.AsyncAppendText(path)
static member OpenReadAsync(path) = System.IO.File.AsyncOpenRead(path)
static member OpenWriteAsync(path) = System.IO.File.AsyncOpenWrite(path)
static member OpenAsync(path,mode,?access,?share) = System.IO.File.AsyncOpen(path, mode, ?access=access, ?share=share)
Другими словами, Асинхронный файл, streamreader, и операции WebClient являются просто обертками вокруг синхронных операций, таким образом, необходимо смочь записать собственную обертку вокруг GetFiles/GetDirectories следующим образом:
module IOExtensions =
type System.IO.Directory with
static member AsyncGetFiles(directory) = async { return System.IO.Directory.GetFiles(directory) }
static member AsyncGetDirectories(path) = async { return System.IO.Directory.GetDirectories(path) }
Я несколько раз использовал этот подход для получения Асинхронных объектов от функций/процедур, и он всегда работал отлично:
let AsyncGetDirectories path =
let fn = new Func<_, _>(System.IO.Directory.GetDirectories)
Async.BuildPrimitive(path, fn.BeginInvoke, fn.EndInvoke)
Возможно см. также
http://weblogs.asp.net/podwysocki/archive/2009/03/18/functional-net-laziness-becomes-you.aspx
Ответ принцессы является способом пойти для добавления гранулярности между задачами - таким образом, такого рода вещь позволила бы другим плеерам использовать пул потоков:
let! x = OpenTextAsync("whatever");
// opening for something else to run
let! x = OpenTextAsync("whatever");
// opening for something else to run
let! x = OpenTextAsync("whatever");
Не помогает столько же, когда каждый из тех, которые блокируют вызовы, тяжел - и GetFiles по SMB является в значительной степени определением тяжелых.
Я надеялся, что был своего рода эквивалент для BeginRead
/EndRead
для каталогов и этого GetFiles
/GetDirectories
была просто хорошая обертка вокруг вызовов низшего уровня, которые выставили некоторые асинхронные варианты. Что-то как BeginReadDir
/EndReadDir
.