:: Не фоксом единым
Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
В консольном приложении всё работает отлично:

class Program
{
static async Task MyFuncAsync(byte[] bytes)
{
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write))
{
await fileStream.WriteAsync(bytes, 0, bytes.Length);
}
}
static void Main(string[] args)
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
Task task = MyFuncAsync(buffer);
// тут ещё какие то действия
task.Wait();
Console.ReadLine();
}
}

Создал WinForms проект, немного подкорректировал Form1.cs, теперь он выглядит так:

public partial class Form1 : Form
{
public Form1()
{
Button button1 = new Button(); // можно в Конструкторе в "Панели элементов"
button1.Text = "Ok"; // добавить на форму Button
button1.Click += new System.EventHandler(this.button1_Click); //
this.Controls.Add(button1); //
InitializeComponent();
}
async Task MyFuncAsync(byte[] bytes)
{
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write))
{
await fileStream.WriteAsync(bytes, 0, bytes.Length);
}
}
private void button1_Click(object sender, EventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
Task task = MyFuncAsync(buffer);
// тут ещё какие то действия
task.Wait();
}
}

При нажатии кнопки форма виснет, дождаться окончания программы не получается. Файл sss.txt создаётся - но он пустой. Приходится прерывать выполнение программы (в момент остановки программа находится на task.Wait()). В чём косяк?



Исправлено 1 раз(а). Последнее : S-type, 12.08.17 10:46
Ratings: 0 negative/0 positive
Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Создал VPF проект. Добавил на форму Button, получился MainWindow.xaml:

<Window x:Class="WpfAsync.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfAsync"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="128" Margin="0,0,0,250" Click="Button_Click" Height="69"/>
</Grid>
</Window>

Подкорректировал MainWindows.xaml.cs:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
async Task MyFuncAsync(byte[] bytes)
{
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write))
{
await fileStream.WriteAsync(bytes, 0, bytes.Length);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
Task task = MyFuncAsync(buffer);
// тут ещё какие то действия
task.Wait();
}
}

Нажимаю кнопку - программа виснет...
Ratings: 0 negative/0 positive
Re: Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
А вот такой код прекрасно работает в VFP:

async Task MyFuncAsync(string data)
{
using (StreamWriter streamWriter = File.CreateText(@"c:\temp\sss.txt"))
{
await streamWriter.WriteAsync(data);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//byte[] buffer = Encoding.UTF8.GetBytes("Данные");
//Task task = MyFuncAsync(buffer);
Task task = MyFuncAsync("Данные");
// тут ещё какие то действия
task.Wait();
}

Т.е. проблема в FileStream.WriteAsync...
Ratings: 0 negative/0 positive
Re: Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Вариант:

private async void Button_Click(object sender, RoutedEventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write))
{
await fileStream.WriteAsync(buffer, 0, buffer.Length);
}
}

работает. Но, бизнес-логика в обработчике кнопки вовсе не нужна.
Ratings: 0 negative/0 positive
Re: Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Почитал docs.microsoft.com , переписал код так:

async Task MyFuncAsync(byte[] bytes)
{
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write,
FileShare.None, bufferSize: 4096, useAsync: true))
{
await fileStream.WriteAsync(bytes, 0, bytes.Length);
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
Task task = MyFuncAsync(buffer);
task.Wait();
}

Всё равно - виснет...



Исправлено 1 раз(а). Последнее : S-type, 12.08.17 00:42
Ratings: 0 negative/0 positive
Re: Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Попробовал вынести бизнес-логику в отдельный класс.

Создал класс:

class Bisnes
{
public void Run()
{
byte[] buffer = Encoding.UTF8.GetBytes("Данные");
Task task = MyFuncAsync(buffer);
// тут ещё какие то действия
task.Wait();
}
async Task MyFuncAsync(byte[] bytes)
{
using (FileStream fileStream = new FileStream(@"c:\temp\sss.txt", FileMode.Create, FileAccess.Write,
FileShare.None, bufferSize: 4096, useAsync: true))
{
await fileStream.WriteAsync(bytes, 0, bytes.Length);
}
}
}


В MainWindows.xaml.cs оставил:

private void Button_Click(object sender, RoutedEventArgs e)
{
new Bisnes().Run();
}

Всё равно - виснет.
Ratings: 0 negative/0 positive
Re: Асинхронность 2
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Погуглил, наткнулся на habrahabr.ru :

Цитата:
Некоторые контексты синхронизации не поддерживают повторный вход в них и являются однопоточными. Это означает, что только одна единица работы может выполняться в этом контексте одновременно. Примером этого может быть поток Windows UI или контекст ASP.NET.

В таких однопоточных контекстах синхронизации довольно легко получить deadlock. Если вы создадите задачу в однопоточном контексте, и потом будете ждать в этом же контексте, ваш код, который ждёт, будет блокировать выполнение фоновой задачи.

[...]

Не используйте Wait для задач в однопоточных контекстах синхронизации, таких как:

  • Потоки UI
  • Контекст ASP.NET

  • Это и есть описание граблей, на которые я наступил?
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    S-type
    Автор

    Сообщений: 2969
    Дата регистрации: 24.04.2004
    MainWindows.xaml.cs вместо

    private void Button_Click(object sender, RoutedEventArgs e)
    {
    new Bisnes().Run();
    }

    написал:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
    new System.Threading.Thread(() =>
    {
    new Bisnes().Run();
    }).Start();
    }

    Теперь всё работает...
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    Simple777

    Сообщений: 33855
    Дата регистрации: 05.11.2006
    "Ну... за самодостаточность!.."
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    S-type
    Автор

    Сообщений: 2969
    Дата регистрации: 24.04.2004
    Скребутся кошки на душе - а всё ли я правильно сделал? Хотелось бы знать...
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    Simple777

    Сообщений: 33855
    Дата регистрации: 05.11.2006
    Это надоть IK дожидаться... [sm128]
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    alex;

    Сообщений: 2857
    Откуда: Москва
    Дата регистрации: 23.11.2004
    Simple777
    "Ну... за самодостаточность!.."

    Поддержу))
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    alex;

    Сообщений: 2857
    Откуда: Москва
    Дата регистрации: 23.11.2004
    А что нет достойной лит-ры по тестированию таких аппс?
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    Igor Korolyov

    Сообщений: 34580
    Дата регистрации: 28.05.2002
    S-type
    Погуглил, наткнулся на habrahabr.ru
    Это и есть описание граблей, на которые я наступил?
    Да.
    Ещё многое тебе предстоит прочесть, прежде чем сможешь корректно писать асинхронные и многопоточные/параллельные куски кода...


    ------------------
    WBR, Igor
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    Simple777

    Сообщений: 33855
    Дата регистрации: 05.11.2006
    Очевидно, море способствует йодоподобному изложению мыслей... [sm128]
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    S-type
    Автор

    Сообщений: 2969
    Дата регистрации: 24.04.2004
    Igor Korolyov
    Ещё многое тебе предстоит прочесть, прежде чем сможешь корректно писать асинхронные и многопоточные/параллельные куски кода...
    Надо же когда то начинать Как было написано в www.oszone.net (на сколько понимаю, это перевод msdn.microsoft.com):

    Цитата:
    С появлением Microsoft .NET Framework 4.5 языки C# и Visual Basic откроют асинхронность для всех остальных, и теперь даже простые смертные смогут писать асинхронные методы почти так же легко, как синхронные.

    Так что, полез читать дальше.
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    NSF

    Сообщений: 3853
    Откуда: Пермь
    Дата регистрации: 21.01.2005
    S-type
    С появлением Microsoft .NET Framework 4.5 языки C# и Visual Basic откроют асинхронность для всех остальных, и теперь даже простые смертные смогут писать асинхронные методы почти так же легко, как синхронные.
    ужос


    ------------------
    откапываю!
    Ratings: 0 negative/1 positive
    Re: Асинхронность 2
    Igor Korolyov

    Сообщений: 34580
    Дата регистрации: 28.05.2002
    NSF
    ужос
    Нельзя не согласиться

    Одно обнадёживает - "простые смертные программисты" всё же не станут писать асинхронные методы, как простые смертные граждане не занимаются в массовом порядке шпагоглотанием или хождением по канату над пропастью, хотя и не имеют никаких особых ограничений так делать
    Ну а "непростые" таки слегка облегчат свой труд.


    ------------------
    WBR, Igor
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    S-type
    Автор

    Сообщений: 2969
    Дата регистрации: 24.04.2004
    Нет уж... Я - простой смертный средний программист. И уже написал асинхронную функцию, и она уже прекрасно работает!
    Ratings: 0 negative/0 positive
    Re: Асинхронность 2
    spinz

    Сообщений: 5263
    Дата регистрации: 21.01.2016
    S-type
    уже написал асинхронную функцию
    жизнь прошла не зря!
    Ratings: 0 negative/0 positive


    Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

    On-line: 7 (Гостей: 7)

    © 2000-2024 Fox Club 
    Яндекс.Метрика